这个问题在这里已有答案:
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 );
不幸的是,这不起作用(抛出"Illegal invocation"错误 - screenshot is here) . 我假设jQuery需要一个表示form-field-names / values的简单键值对象,而我传入的 FormData
实例显然是不兼容的 .
现在,因为可以将 FormData
实例传递给 xhr.send()
,我希望它也可以使它与jQuery一起使用 .
Update:
我've created a 175167 over at jQuery' s Bug Tracker . 它在这里:http://bugs.jquery.com/ticket/9995
我被建议使用“Ajax prefilter”......
Update:
首先,让我演示一个演示我想要实现的行为的演示 .
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请求:
This is what I need - 我想要"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();
});
但是,这导致:
如您所见,内容类型错误...
9 回答
还有一些尚未提及的技术可供您使用 . 首先在ajax params中设置contentType属性 .
以pradeek为例:
在某些情况下,当强制jQuery ajax执行非预期的事情时,
beforeSend
事件是一个很好的地方 . 有一段时间人们使用beforeSend
覆盖mimeType,然后再添加到1.5.1中的jQuery中 . 您应该能够在before send事件中修改jqXHR对象上的任何内容 .如果要使用ajax提交文件,请使用“jquery.form.js”这样可以轻松提交所有表单元素 .
样品http://jquery.malsup.com/form/#ajaxSubmit
粗略观点:
您可以使用以下代码在ajax请求中发送FormData对象,
这与接受的答案非常相似,但是问题主题的实际答案 . 这将在FormData中自动提交表单元素,您无需手动将数据附加到FormData变量 .
ajax方法看起来像这样,
您也可以手动将FormData对象中的表单元素作为参数传递给它
希望能帮助到你 . ;)
而不是 -
fd.append( 'userfile', $('#userfile')[0].files[0]);
使用 -
fd.append( 'file', $('#userfile')[0].files[0]);
我找到的最好的文档和示例在这里https://developer.mozilla.org/en-US/docs/Web/Guide/Using_FormData_Objects
您可以使用$ .ajax
beforeSend
事件来操纵标头 ....
...
有关其他信息,请参阅此链接:http://msdn.microsoft.com/en-us/library/ms536752(v=vs.85).aspx
我这样做,它对我有用,我希望这会有所帮助:)
我相信你可以这样做:
将
processData
设置为false可以防止jQuery自动将数据转换为查询字符串 . 有关详细信息,请参阅the docs .将
contentType
设置为false是必要的,否则jQuery will set it incorrectly .JavaScript的:
PHP: