【发布时间】:2012-06-19 16:19:24
【问题描述】:
我在不使用 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 } } );
但是服务器没有收到文件。 我已阅读How can I upload files asynchronously? 中的问题,但所有解决方案都使用 html 表单。有没有不涉及任何html表单的解决方案?
提前致谢。
在服务器端,我使用的是 Yii PHP Framework:
$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" />
【问题讨论】:
-
请发布您在服务器上运行的代码。您应该能够从 POST 数组访问该文件。
-
@JamWaffles:已添加代码。
标签: javascript jquery ajax upload