【发布时间】:2011-10-21 22:14:56
【问题描述】:
XMLHttpRequest Level 2 标准(仍是工作草案)定义了FormData 接口。此接口允许将 File 对象附加到 XHR 请求(Ajax 请求)。
顺便说一句,这是一项新功能 - 过去使用了“hidden-iframe-trick”(请参阅 my other question 了解相关内容)。
这是它的工作原理(示例):
var xhr = new XMLHttpRequest(),
fd = new FormData();
fd.append( 'file', input.files[0] );
xhr.open( 'POST', 'http://example.com/script.php', true );
xhr.onreadystatechange = handler;
xhr.send( fd );
其中input 是<input type="file"> 字段,handler 是Ajax 请求的成功处理程序。
这适用于所有浏览器(同样,IE 除外)。
现在,我想让这个功能与 jQuery 一起工作。我试过这个:
var fd = new FormData();
fd.append( 'file', input.files[0] );
$.post( 'http://example.com/script.php', fd, handler );
不幸的是,这不起作用(抛出“非法调用”错误 - screenshot is here)。我假设 jQuery 需要一个表示表单字段名称/值的简单键值对象,而我传入的 FormData 实例显然不兼容。
现在,既然可以将FormData 实例传递给xhr.send(),我希望它也可以与jQuery 一起使用。
更新:
我在 jQuery 的 Bug Tracker 上创建了一个“功能票”。在这里:http://bugs.jquery.com/ticket/9995
有人建议我使用“Ajax 预过滤器”...
更新:
首先,让我做一个演示,展示我想要实现的行为。
HTML:
<form>
<input type="file" id="file" name="file">
<input type="submit">
</form>
JavaScript:
$( 'form' ).submit(function ( e ) {
var data, xhr;
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
xhr = new XMLHttpRequest();
xhr.open( 'POST', 'http://hacheck.tel.fer.hr/xml.pl', true );
xhr.onreadystatechange = function ( response ) {};
xhr.send( data );
e.preventDefault();
});
上面的代码产生了这个 HTTP 请求:
这就是我需要的 - 我想要“multipart/form-data”内容类型!
建议的解决方案是这样的:
$( 'form' ).submit(function ( e ) {
var data;
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
$.ajax({
url: 'http://hacheck.tel.fer.hr/xml.pl',
data: data,
processData: false,
type: 'POST',
success: function ( data ) {
alert( data );
}
});
e.preventDefault();
});
但是,这会导致:
如您所见,内容类型错误...
【问题讨论】:
-
是的!这是一个好主意!也感谢您提供的信息。我最近发现了一个可以做到这一点的 sn-p,但它不是 jQuery,我想知道 jQuery 是否可以做到。这对我来说更像是一个答案而不是一个问题。随时通知我们!
-
现在如果我/我们知道在所说的预过滤器中放什么。
-
这里的情况相同。任何人的更多线索?
-
@zaf Setting
processData:false是朝着正确方向迈出的一步(请参阅 pradeek 提出的解决方案)。现在,如果我可以手动设置“Content-Type”HTTP 请求标头...有关详细信息,请参阅我更新的问题。 -
这里没有回答您的问题吗? stackoverflow.com/questions/5392344/…
标签: javascript jquery ajax html multipartform-data