微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery用FormData实现文件上传的方法

前言

我们引入jQuery来进行异步上传可以获得更好的用户体验。 一方面,在JavaScript中进行异步操作比表单更加灵活; 另一方面,异步上传也避免了上传文件时的页面长时间卡死。

HTML

一个type=file就可以让用户来浏览并选择文件, 一般会把输入控件放到一个

中,下面的一个简单的表单:

rush:xhtml;">

但为什么我只能选择一个文件??给添加一个multiple属性就可以多选了!

rush:xhtml;">

获取文件列表

上述的将会拥有一个files的DOM属性,包含了所选的文件列表(Array)。

rush:js;"> $('button').click(function(){ var $input = $('#avatar'); // 相当于: $input[0].files,$input.get(0).files var files = $input.prop('files'); console.log(files); });

这个Array中的每一项都是一个File对象,它有下面几个主要属性

name: 文件名,只读字符串,不包含任何路径信息.

size: 文件大小,单位为字节,只读的64位整数.

type: MIME类型,如果类型未知,则返回空字符串.

详情可以参考:https://developer.mozilla.org/zh-CN/docs/Using_files_from_web_applications

multipart/form-data

上传文件比较特殊,其内容是二进制数据,而HTTP提供的是基于文本的通信协议。 这时需要采用multipart/form-data编码的HTTP表单。

其HTTP消息体格式如下所示:

rush:js;"> ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-disposition: form-data; name="title"

harttle
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-disposition: form-data; name="avatar"; filename="harttle.png"
Content-Type: image/png

... content of harttle.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

每个字段由一段boundary string来分隔,浏览器保证该boundary string不与内容重复, 因而multipart/form-data能够成功编码二进制数据。

jQuery上传文件

这是XMLHttpRequest Level 2提供的FormData对象可以帮助我们进行二进制文件multipart/form-data编码:

rush:js;"> $('button').click(function(){ var files = $('#avatar').prop('files');

var data = new FormData();
data.append('avatar',files[0]);

$.ajax({
url: '/api/upload',type: 'POST',data: data,cache: false,processData: false,contentType: false
});
});

url,type,data想必做前端的都很熟悉了,介绍其余三个参数:

cache

cache设为false可以禁止浏览器对该URL(以及对应的HTTP方法)的缓存。 jQuery通过为URL添加一个冗余参数来实现。

方法只对GET和HEAD起作用,然而IE8会缓存之前的GET结果来响应POST请求。 这里设置cache: false是为了兼容IE8。

参考:http://api.jquery.com/jquery.ajax/

contentType

jQuery中content-type认值为application/x-www-form-urlencoded, 因此传给data参数的对象会认被转换为query string(见HTTP 表单编码 enctype)。

我们不需要jQuery做这个转换,否则会破坏掉multipart/form-data的编码格式。 因此设置contentType: false禁止jQuery的转换操作。

processData

jQuery会将data对象转换为字符串来发送HTTP请求,认情况下会用 application/x-www-form-urlencoded编码来进行转换。 我们设置contentType: false后该转换会失败,因此设置processData: false禁止该转换过程。

我们给的data就是已经用FormData编码好的数据,不需要jQuery进行字符串转换

兼容性与其他选择

本文介绍的jQuery文件上传方式依赖于FormData对象, 这是XMLHttpRequest Level 2接口, 需要 IE 10+,Firefox 4.0+,Chrome 7+,Safari 5+,Opera 12+

这意味着对于低版本浏览器只能使用直接提交文件表单的形式, 但提交大文件表单页面会长时间不响应,如果希望在低版本浏览器中解决该问题, 就只能使用别的方式来实现了,比如很多支持文件上传进度的Flash插件

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。谢谢大家对编程之家的支持

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐