为未来的读者总结。
异步文件上传
使用 HTML5
您可以将文件上传与jQuery使用$.ajax()
方法,如果FORMDATA和文件API的支持(包括HTML5功能)。
您也可以在没有 FormData 的情况下发送文件,但无论哪种方式,文件 API 都必须存在才能以可以使用XMLHttpRequest (Ajax)发送的方式处理文件。
$.ajax({
url: 'file/destination.html',
type: 'POST',
data: new FormData($('#formWithFiles')[0]), // The form with the file inputs.
processData: false,
contentType: false // Using FormData, no need to process data.
}).done(function(){
console.log("Success: Files sent!");
}).fail(function(){
console.log("An error occurred, the files couldn't be sent!");
});
有关快速、纯 JavaScript(无 jQuery)的示例,请参阅“使用 FormData 对象发送文件”。
倒退
当不支持 HTML5(无文件 API)时,唯一的其他纯 JavaScript 解决方案(无Flash或任何其他浏览器插件)是隐藏的 iframe技术,它允许在不使用XMLHttpRequest对象的情况下模拟异步请求。
它包括将 iframe 设置为具有文件输入的表单的目标。当用户提交请求并上传文件时,响应显示在 iframe 内,而不是重新呈现主页。隐藏 iframe 使整个过程对用户透明并模拟异步请求。
如果做得好,它几乎可以在任何浏览器上运行,但它有一些关于如何从 iframe 获取响应的警告。
在这种情况下,您可能更喜欢使用像Bifröst这样的包装插件,它使用iframe 技术,但也提供了一个jQuery Ajax 传输,允许使用如下方法发送文件$.ajax()
:
$.ajax({
url: 'file/destination.html',
type: 'POST',
// Set the transport to use (iframe means to use Bifröst)
// and the expected data type (json in this case).
dataType: 'iframe json',
fileInputs: $('input[type="file"]'), // The file inputs containing the files to send.
data: { msg: 'Some extra data you might need.'}
}).done(function(){
console.log("Success: Files sent!");
}).fail(function(){
console.log("An error occurred, the files couldn't be sent!");
});
插件
Bifröst只是一个小包装器,它为 jQuery 的 ajax 方法添加了回退支持,但前面提到的许多插件(如jQuery 表单插件或jQuery 文件上传)包括从 HTML5 到不同回退的整个堆栈和一些有用的功能,以简化流程。根据您的需要和要求,您可能需要考虑裸实现或此插件中的任何一个。