1

記事の作成、読み取り、更新、削除を処理する Web アプリケーションがあり、各記事に画像のギャラリーが必要であるとします。Article と Gallery を 1 対 1 の関係にし、Gallery と Media を 1 対多の関係にする必要があります。

HTML5 はマルチアップロードのような多くの機能を提供するので、この優れたhttp://blueimp.github.io/jQuery-File-Upload/プラグインを使用したいと考えています。問題は、他のフォームのデータのように「メモリ内」でファイルのアップロードを処理する方法ですか?

たとえば、新しい記事を作成するためのページを表示すると、記事のデータ フィールドに入力し、アップロードする画像を選択できるはずです。次に保存ボタンをクリックすると、画像のアップロードが開始され、その後フォームが送信されます。検証が失敗した場合でも、画像はフロントエンドに表示されますが、サーバー側では何も保存されません。

解決策の 1 つは、フォーム全体を表示する前に「エンティティ セッションの一時 ID を作成する」のようなものを作成し、その ID を使用してアップロードを保存するための一時ディレクトリを作成できるため、保存に成功した後、これらの画像を適切なディレクトリに移動できますが、どのように「エンティティセッションの一時IDを作成する」には?

私が考えるもう1つの解決策は、「編集IDを使用する」アプローチです。これは、以前に保存したギャラリーIDでアップロードを処理できるためですが、新しい空白の記事をギャラリーに保存できない場合があるため、フィールドの一部を空にすることはできませんデシベルで。

Rails については、https://github.com/thoughtbot/paperclip gem を見ました。Readme には次のように書かれています。

Paperclip は、Active Record の簡単なファイル添付ライブラリとして意図されています。その背後にある意図は、セットアップをできるだけ簡単に保ち、ファイルをできるだけ他の属性と同じように扱うことでした。これは、ActiveRecord::Base#save が呼び出されるまで、ディスク上の最終的な場所に保存されず、nil に設定されている場合は削除されないことを意味します。

私の質問は、それがどのように機能するかです。

4

2 に答える 2

5

create mask でファイルのアップロードを有効にする際の問題は、最終的に孤立したファイルになってしまうことです。これは、ユーザーが実際のエンティティを保存せずにアップロードをトリガーできるためです。独自の UploadBundle を作成しているときに、この問題についてしばらく考えた結果、真に適切な解決策はないという結論に達しました。

私は次のように実装しました:

問題が孤立したファイルから発生するという事実を考慮して、Orphanageこれらのファイルの管理を担当する を作成しました。アップロードされたファイルは、まず session_id とともに別のディレクトリに保存されます。これは、さまざまなユーザー間でファイルを区別するのに役立ちます。フォームを送信して実際のエンティティを作成したら、セッション ID のみを使用して孤児院からファイルを取得できます。フォームが有効であった場合は、ファイルを一時的な孤児院のディレクトリからファイルの最終的な宛先に移動できます。

この方法にはいくつかの落とし穴があります。

  • orphanage ディレクトリ自体は、cron ジョブなどを使用して定期的にクリーンアップする必要があります。
  • ユーザーがファイルをアップロードし、フォームを送信しないことを選択し、代わりに新しいフォームでやり直す場合、新しくアップロードされたファイルは同じディレクトリに移動されます。したがって、アップロードされたファイルを取得した後、最初にアップロードされたファイルと 2 回目にアップロードされたファイルの両方を取得します。

これは、この問題の最終的な解決策ではありませんが、回避策です。私の意見では、一時的なエンティティやセッション ベースのストレージ システムを使用するよりもクリーンです。

上記のバンドルは Github で入手でき、OrphanagejQuery File Uploaderプラグインの両方をサポートしています。

1up-lab/OneupUploaderBundle

于 2013-08-09T14:41:06.330 に答える
0

私は個人的にこの事件に取り組んだことはありませんが、私の同僚は同様の難問を抱えていました。彼女が使用しました

punkave/symfony2-file-uploader-bundle

jQuery File Upload プラグインをラップするバンドルです。まだ初期段階で、イベントなど未完成な部分も多いですが、挑戦してみました。

newAction() では、エンティティを作成し、一意のディレクトリ ID を生成し、(通常の setDirId() を介して) ID をエンティティに格納します。非表示フィールド dirId を含むフォームを作成します。

送信時ではなく、ajax経由でサーバー上の一時ディレクトリにファイルをアップロードしています。Ajax リクエストには ID が必要です。temp_dir/prefix_ID にファイルを保存します

それは非常に単純です。フォームが送信されます。フォームが有効な場合 - ファイルを temp から dest dir に移動します。そうでない場合は、ID があり、画像を表示できます。

ただし、個々のファイルに関する情報をデータベース内の別のテーブルに保存することはありません。dirId に対応するフォルダーの内容を読み取るたびに。

私はそれがあなたが求めている解決策ではないことを知っています. むしろ回避策です。

于 2013-08-09T13:40:35.647 に答える