複数ファイル フィールドを持つフォームを作成しようとしています。ドキュメントはかなりあいまいなので:
- http://symfony.com/doc/current/reference/forms/types/file.html
- http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html
W3C FileReader API (以下のドキュメントの URL に基づく) を使用して、クライアントからのファイルを処理し、ビューからエンティティへの基になるデータを管理することにしました。現在、ドラッグ アンド ドロップ、メタデータ、およびクライアントでの複数選択をサポートしています。
- http://www.html5rocks.com/en/tutorials/file/dndfiles/
- http://playground.html5rocks.com/#reading_file_metadata
- https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
しかし、UploadedFile オブジェクトにもう一度チャンスを与えたいのですが、主な問題は、エンティティ (FileUpload
タイプ) のファイル プロパティを作成して複数のファイル データを格納できないことです。私の入力は次のようになります。
<input type="file" id="upload_files" name="upload[files][]" required="required" multiple="multiple" />
理論的には、名前を配列にした場合、fileUpload にはファイルが含まれているはずですが、含まれていません。UploadedFile オブジェクトに複数のファイル データを保存できますか? またはただのシングル?
http://api.symfony.com/2.2/Symfony/Component/HttpFoundation/File/UploadedFile.html
また、(__construct
エンティティの)$files
プロパティを配列として初期化し、setFiles()
新しい配列インデックスを格納するように変更しようとしました$this->files[] = $file;
...ご存知のとおりです。
しかし、Symfony はその例外を教えてくれます:
フォームのビュー データは、クラス Symfony\Component\HttpFoundation\File\File のインスタンスであると予想されますが、(n) 配列です。「data_class」オプションを null に設定するか、a(n) 配列を Symfony\Component\HttpFoundation\File\File のインスタンスに変換するビュー トランスフォーマーを追加することで、このエラーを回避できます。
私はデータトランスフォーマーに慣れていません。そして、今どのようにできるのか理解できません。または、すべてのファイル データで UploadedFile オブジェクトを取得することが本当に役立つ場合。
合成では...この与えられた情報と以下のコードで。最後に追加されたファイルだけでなく、FileUploadオブジェクトに正しい数のファイルを取得するのを手伝ってくれる人はいますか? ありがとうございました
github にレポを作成しました: https://github.com/jeflopo/fileupload
簡潔にするために、関連ファイルを次に示します。
フォーム: https://github.com/jeflopo/fileupload/blob/master/src/Acme/DemoBundle/Form/Type/FileUploadType.php
エンティティ: https://github.com/jeflopo/fileupload/blob/master/src/Acme/DemoBundle/Entity/FileUpload.php
コントローラー (uploadAction を参照): https://github.com/jeflopo/fileupload/blob/master/src/Acme/DemoBundle/Controller/DemoController.php
クライアントでファイルを処理する JavaScript (サーバーでのファイルの動作には影響しません): https://github.com/jeflopo/fileupload/blob/master/src/Acme/DemoBundle/Resources/public/js/ upload.js