我在不使用 html 表单的情况下通过 ajax 上传文件时遇到了困难。我的情况是这样的:
- 我有一个文本区域
- 我想压缩该文本区域的内容并通过 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();
然后我使用Jquery ajax 方法发送,像这样:
$.post("the_url", { GradeRequest : { submitter_id : "foobar", evaluationset_id : 9, mode : 1, source_file : "a.cpp", file: content } } );
但是服务器上没有收到文件。我已阅读如何异步上传文件中的问题?,但所有解决方案都使用 html 表单。有没有不涉及任何 html 表单的解决方案?
提前致谢。
在服务器端,我使用的是 Yii PHP 框架:
$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" />