【发布时间】:2013-03-29 09:42:07
【问题描述】:
我有一个带有单个文件字段的表单:
<form id="myForm" action="/processFile" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile">
</form>
我想通过 AJAX 提交表单(在客户端使用 jQuery,在服务器端使用 Node.JS)。
这是我在 jQuery 客户端首先尝试的(在查看了类似 Submit form via AJAX in jQuery 这样的问题之后):
submitButton.on('click', function(ev) {
$.ajax({
type: "GET",
url: $('#myForm').action
data: { form: $('#myForm').seralize() }
}).done(function(res) {
$('#targetDiv').html(res);
});
});
很遗憾,这不起作用,因为 .seralize() 方法不适用于文件输入。
所以我决定实际发布表单是最好的方法,因为它处理了将文件上传到服务器的异步混乱。所以我尝试了这个:
submitButton.on('click', function(ev) {
$('#myForm').submit(function(err) {
$.ajax({
type: "GET",
url: $('#myForm').action
data: { form: $('#myForm').seralize() }
}).done(function(res) {
$('#targetDiv').html(res);
});
});
});
即(1)实际提交表单,然后(2)在表单提交的回调中进行我的ajax调用。
遗憾的是,这也不起作用,因为提交表单需要根据“/processFile”的响应重新加载整个页面。
我想要的是 (1)提交文件输入尽可能简单地通过 AJAX,以及 (2) 使用 URL 的响应来注入一些部分HTML。似乎您可以使用一些 iFrame 技巧(例如 http://www.jainaewen.com/files/javascript/jquery/iframe-post-form.html)来解决这个问题,但有没有我没有看到的更清洁的方法?
【问题讨论】:
-
使用 ajax 上传文件的唯一方法是通过FormData,对于没有它的浏览器,iframe 技巧用于模拟 ajax 文件上传。
-
@Musa
FormData不需要使用 XHR/ajax 上传文件。您可以简单地将File或Blob传递给XMLHttpRequest实例上的send(...)方法。 -
@RayNicholus 让我纠正一下自己,使用 ajax 和 multipart/form-data 上传文件的唯一方法是通过
FormData。通过传递 blob 文件,您无法像处理常规表单帖子那样处理它们。
标签: jquery ajax forms file-upload