GridFSは、大きなファイルを保存するためのMongoDB仕様です。 この記事では、ファイルをGridFSに簡単にアップロードし、データベースから抽出してブラウザーに表示する方法を説明します。
しかし、始める前に、Kridina Chodorowの
GridFSの仕組みを簡単に説明します。
GridFSは、大きなファイルを小さな断片に分割します。 ピースは1つのコレクション(fs.chunks)に保存され、ファイルのメタデータは別のコレクション(fs.files)に保存されます。 ファイルに要求を行うと、GridFSはスライスを使用してコレクションに要求を行い、ファイル全体を返します。
もちろん、PHP用MongoDBドライバーには、GridFSからファイルを保存および取得するために使用できる
いくつかのクラスが付属しています。
この記事で説明したGridFSの利点のいくつか:
- レプリケーションまたはシャーディングを使用する場合、GridFSがすべてを行います。
- MongoDBはファイルを2GBのチャンクに分割するため、OSでファイルを操作する際に問題が発生することはありません。
- ファイル名や1つのディレクトリ内のファイル数に関するOSの制限について心配する必要はありません。
- MongoDBは、ファイルのMD5ハッシュを自動的に生成して保存します。 これは、MD5ハッシュを使用してダウンロードしたファイルを比較し、重複を検出したり、ダウンロードの成功を検証したりするのに役立ちます。
GridFSドキュメントの作成
簡単な
アップロードドキュメントから始めましょう。
namespace Dennis\UploadBundle\Document; use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; class Upload { private $id; private $file; private $filename; private $mimeType; private $uploadDate; private $length; private $chunkSize; private $md5; public function getFile() { return $this->file; } public function setFile($file) { $this->file = $file; } public function getFilename() { return $this->filename; } public function setFilename($filename) { $this->filename = $filename; } public function getMimeType() { return $this->mimeType; } public function setMimeType($mimeType) { $this->mimeType = $mimeType; } public function getChunkSize() { return $this->chunkSize; } public function getLength() { return $this->length; } public function getMd5() { return $this->md5; } public function getUploadDate() { return $this->uploadDate; } }
このリストの重要な部分は
@MongoDB \ Fileアノテーションです。 彼女は
Doctrine MongoDB ODMに、ドキュメントをGridFSを使用して保存する必要があり、MongoGridFSFileクラスのインスタンスが
$ fileプロパティに含まれていることを伝えます。
$ chunkSize 、
$ length 、
$ md5および
$ uploadDateプロパティは、MongoDBドライバーによって自動的に入力されるため、セッターを必要としません。
ファイルアップロード処理
例として、フォームビルダーを使用する単純なコントローラーを使用して、
fileタイプのフィールドを持つフォームを作成し
ます 。
namespace Dennis\UploadBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class UploadController extends Controller { public function newAction(Request $request) { $form = $this->createFormBuilder(array()) ->add('upload', 'file') ->getForm(); if ($request->isMethod('POST')) { $form->bind($request);
私の目標は、ファイルシステムの周りの複数のファイル転送を回避するために、ダウンロード後に
/ tmpフォルダーから直接データベースにファイルを保存することです。 これを行うには、
$ form-> getData()を使用してフォームから送信されたデータを抽出し、
UploadedFileオブジェクトを取得します。 エンティティを使用する場合、
UploadedFileオブジェクトはエンティティのプロパティの値から取得できます。このプロパティの値は、フォームビルダーで
fileタイプのフィールドとして指定され
ます 。
UploadedFileオブジェクトには、グローバルPHP変数
$ _FILESのデータに基づいているため、一時フォルダーからデータベースに直接ファイルを追加するために必要なすべての情報が含まれています。
use Dennis\UploadBundle\Document\Upload; public function newAction(Request $request) {
必要な情報がすべて揃ったので、
Uploadオブジェクトを作成して、一時ファイルへのパスを
$ fileプロパティに渡すことができます。
UploadedFileオブジェクトは、ファイルに関する追加情報も提供します。その一部は、MIMEタイプやファイル名など、
アップロードドキュメントに追加できます。 この段階では、ドキュメントをデータベースに保存する準備ができており、ODMから予想されるように、これは
persist()および
flush()を使用して行われます。
ダウンロードしたファイルをGridFSから抽出する
データベースにファイルができたので、ファイルを取得してブラウザに表示する方法を見てみましょう。
上記で説明したコントローラーに、別のメソッドを追加します。
public function showAction($id) { $upload = $this->get('doctrine.odm.mongodb.document_manager') ->getRepository('DennisUploadBundle:Upload') ->find($id); if (null === $upload) { throw $this->createNotFoundException(sprintf('Upload with id "%s" could not be found', $id)); } $response = new Response(); $response->headers->set('Content-Type', $upload->getMimeType()); $response->setContent($upload->getFile()->getBytes()); return $response; }
ご覧のとおり、かなり簡単です。 MongoDBによって生成されたidパラメーターはURLで指定する必要があり、データベースから
アップロードドキュメントを取得するために使用されます。 ファイルを出力するには、
Content-Typeを使用して
Responseクラスのオブジェクトを作成します。これは、
アップロードドキュメントの
$ mimeTypeプロパティから
取得します。 そして、
getBytes()メソッドを使用して、
$ fileプロパティから出力用のコンテンツを取得し
ます 。
ストリームリソースとStreamedResponse
バージョン1.3.0-beta1以降、MongoDBドライバーは、ファイルのストリームリソースを返す
getResource()メソッドを
サポートします。 これにより、通常の
Responseの代わりに
StreamedResponseオブジェクトを使用できます。
StreamedResponseを使用
すると、
コールバックを使用して、クライアントにコンテンツをストリーミングでき
ます (ブラウザ-約Per。)。 次のようになります。
public function showAction($id) {
今のところすべてです。 次の記事では、
アップロードドキュメントとエンティティを組み合わせる方法について説明します。
-これは、
MongoDB GridFSへのファイルのアップロードの記事の無料翻訳です。 2番目の部分の翻訳が計画されています。