使用pjax(和jQuery.form?)发布带有文件附件的表单

maw*_*awi 7 jquery pjax

我成功地将pjax用于链接和表单(GET以及POST).但现在我有一个表格,也必须发送一个<input type="file"...>.由于pjax不支持这一点,我查看了https://github.com/malsup/form(jquery.form插件),支持使用文件提交表单数据,但不支持以"pjax"方式使用浏览器历史对象.

那么,如何在包含文件字段的表单中使用pjax功能呢?有任何想法吗?

编辑:我之所以不简单地使用FormData对象,而是jquery.form插件:Internet Explorer无法处理它们.该插件为此浏览器提供了一种解决方法.我不坚持使用jquery.form插件,但我需要一种方法使它适用于所有主流浏览器.

Jas*_*lsa 5

看起来您可能需要FormData在AJAX/pJAX请求中使用可以处理文件的对象.您可以在Mozilla开发者网络上阅读更多信息.

例如,如果这是您的表单:

<form enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
Run Code Online (Sandbox Code Playgroud)

首先得到文件内容如下:

var formData = new FormData($('form')[0]);
Run Code Online (Sandbox Code Playgroud)

然后你可以使用jQuery $.ajax请求或简单XMLHttpRequest();如下:

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://foo.com/processfile.php");
xhr.send(formData);
Run Code Online (Sandbox Code Playgroud)

或类似的jQuery:

$.ajax({
    url: 'http://foo.com/processfile.php',
    type: 'POST',
    data: formData,
    cache: false,
    contentType: false,
    processData: false
});
Run Code Online (Sandbox Code Playgroud)

在服务器端,在processfile.php,您可以使用以下方式接收/显示文件内容:

$file = $_FILES['file']['name'];

这应该与pJAX一起使用,因为它是异步的!只需确保在pJAX请求之前发出此请求,或者如果您使用的是jQuery,则可以将其添加为成功回调的一部分.例如(不知道您使用的是哪个pJAX库):

$.ajax({
    url: 'http://foo.com/processfile.php',
    type: 'POST',
    data: formData,
    cache: false,
    contentType: false,
    processData: false,
    success: function(data) {
       $.pjax({url: url, container: '#pjax-container'});
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想支持IE7 +,你需要回退使用隐藏的iframe元素进行上传,因为FormData仅在Internet Explorer 10中受支持.一个伟大的插件,用于提交我已经测试过的文件,并且没有jQuery的工作是http: //fineuploader.com/在我看来比https://github.com/malsup/form(jquery.form插件)更好/更容易使用.