htmlフォームを歌わずにajax経由でファイルをアップロードする際に問題が発生しています。私の場合は次のようになります。
- テキストエリアがあります
- そのテキストエリアのコンテンツをzipして、AJAX経由でサーバーにアップロードしたいと思います(現在、JSZipを使用しています) 。
テストの目的で、次のように送信するダミーのzipファイルを作成しようとします(textareaコンテンツを取得しません)。
var zip = new JSZip(); zip.file("hello1.txt", "Hello First World\n");<br/> zip.file("hello2.txt", "Hello Second World\n");<br/> var content = zip.generate();
次に、Jqueryajaxメソッドを使用して次のように送信します。
$.post("the_url", { GradeRequest : { submitter_id : "foobar", evaluationset_id : 9, mode : 1, source_file : "a.cpp", file: content } } );
ただし、ファイルはサーバーで受信されません。非同期でファイルをアップロードするにはどうすればよいですか?の質問を読みました。、ただし、すべてのソリューションはhtmlフォームを使用しています。htmlフォームを含まないソリューションはありますか?
前もって感謝します。
サーバー側では、YiiPHPFrameworkを使用しています。
$model = $this->model;
if ($model !== null && isset($_POST['GradeRequest'])) {
$model->setAttributes($_POST['GradeRequest']);
if ($model->validate()) {
if (isset($_FILES['GradeRequest']['tmp_name']['file']) && $_FILES['GradeRequest']['tmp_name']['file'] !== "") {
$model->file = file_get_contents($_FILES['GradeRequest']['tmp_name']['file']);
$model->source_file = $_FILES['GradeRequest']['name']['file'];
}
$this->setReply(true, "Ok");
$model->client_id = $this->clientId;
$model->request_id = $this->requestRecord->id;
$model->save();
} else {
$this->setReply(false, $model->getErrors());
}
}
概念実証として、私はこのようなフォームバージョンを作成し、それが機能します(ファイルがサーバーにアップロードされました)。
<form enctype="multipart/form-data" method="post" action="[the_url]>
EvaluationSet id: <input type="text" name="GradeRequest[evaluationset_id]" /><br />
<input type="hidden" name="GradeRequest[mode]" value="0" />
<input type="hidden" name="GradeRequest[submitter_id]" value="Someone" />
Source file : <input type="text" name="GradeRequest[source_file]" /><br />
File : <input type="file" name="GradeRequest[file]" /><br />
<input type="submit" />