9

私は現在、動的な数のフォームを持つ django フォームセットを持っています。各フォームにはファイル フィールドがあります。

これは機能しますが、一度に複数のファイルを選択できるようにする方法が必要です。をinput type='file' multiple='multiple'使用してファイル データを読み取ることができますFileReaderform-0-fileしかし、これらのファイルをなどの代わりに django formset に渡すにはどうすればよいform-1-fileですか?

1 つの方法を考えることができます - に置き換えFileFieldTextFieldbase64エンコードされたファイルをテキストとして渡しますが、それが良い解決策かどうかはわかりません。

4

4 に答える 4

0

私は最近、ユーザーがドキュメントをアップロードし、それをサーバーにストリーミングし、サーバーに保存せずにストリームを SOAP サーバーに投稿できるソリューションを実装する必要があるという問題がありました。

私がそれを実装した方法は次のとおりです。

アップロードの進行状況を表示するために、AJAX 経由でファイルをアップロードしたかったのです。

これが私の解決策です (これは一度に 1 つのファイルにしか対応していないことに注意してください。ただし、出発点になる可能性があります。)

JavaScript:

最初に FormData のオブジェクトを宣言します。これは、ファイルとともに追加情報を送信するために使用されます。

var formData = new FormData();

次に、サーバーに送信するすべてのデータを追加します。

formData.append("documentDescription", $("#documentDescription textarea").val());
formData.append("afile", file.files[0]);

XMLHttpRequest の新しいインスタンスを作成します。

var xhr = new XMLHttpRequest();

これは、すべてが機能する残りのコードです。

xhr.open("POST", "UploadDocumentURL", true);
xhr.upload.onprogress = function(e) {
                if (e.lengthComputable) {
                            var percentComplete = (e.loaded / e.total) * 100;
                            $('.progress .bar').css('width', percentComplete + '%').attr('aria-valuenow', percentComplete);
                        }
                    }

xhr.onload = function() {
                        if (this.status == 200) {
                            var resp = JSON.parse(this.response);
                            if (resp.type === "error") {
                                notify.add(resp.type, "Error", resp.message, 3000, true);
                            } else {
                                notify.add(resp.type, "Success", resp.message, 3000);
                            }
                        }
                        ;
                    };

xhr.send(formData);

PHP

$documentName = $_POST["documentDescription"];
$fileName = $_FILES['afile']['name'];
$fileType = $_FILES['afile']['type'];
$ext = pathinfo($fileName, PATHINFO_EXTENSION);
$fileName = pathinfo($fileName, PATHINFO_FILENAME);
$fileContent = file_get_contents($_FILES['afile']['tmp_name']);

これで、サーバー上にバイナリ データが作成されます。

file.files[0]JavaScript でループすることにより、複数のファイルに対してこれを機能させることができるはずです。

これをあなたの問題に適用できることを願っています。

于 2014-07-30T08:24:28.323 に答える
0

画像をファイルとして保存する必要があります(これを行うための良い答えがいくつかあります)

私はすでにその方法で画像を保存しようとしましたが、多くの問題があります:

  1. そのページに移動するたびに、画像の読み込みが再び開始され、人々は毎回同じ画像を読み込みたくありません。

  2. 多くの帯域幅を使用します。

  3. 無料の Web ホスティング サービスを使用している場合、数時間で、または 50 枚の画像を保存すると、帯域幅がすべて消費されます。帯域幅、毎月の帯域幅を強化します。

于 2014-01-16T21:50:07.977 に答える
0

使用multiple='multiple'は、フォームセットまたは単一フォームとは関係ありません。django でネイティブに動作します。そのため、フォームセットの代わりに単一のフォームを使用する予定がある場合は、multiple属性を入力してから request.FILES にアクセスして、アップロードされたすべてのファイルを取得します。

于 2013-05-28T20:23:01.730 に答える