本文摘自PHP中文网,作者零下一度,侵删。
总结我做HTML5文件上传插件遇到的技术问题先贴上源码:fileupload-html5.js(PS:公司使用seajs框架)
问题列表
1. jquery.ajax没有监听上传进度的onprogress事件。
2. XMLHttpRequest(XHR)跨域
问题解答
1. jQuery没有给出onprogress事件的接口,必须从其他接口中找到原生XHR对象。
jQuery.ajax()返回的是jqXHR对象。jqXHR模仿XHR(原生),但没有模仿实现XHR的所有方法和属性(如:.upload),即使jqXHR增加了一个特有方法(如:.promise())。所以jqXHR并不是XHR的超集。
//下面是截取jQ内部的源码,$.ajax();返回的就是这个jqXHR(伪造XMLHttpRequest)
1 2 3 |
|
XHR的upload属性指向XMLHttpRequestUpload(IE10是XMLHttpRequestEventTarget),该对象的onprogress事件可以监听上传进度。既然jQ没有给出这个功能的api,但jQ某些数据上传方式是使用XHR的,所以我们可以从其它api中找到XHR。在XHR发送数据之前绑定onprogress事件可以实现上传进度功能。
我从options参数配置中找到两个与XHR有关的属性:
- xhr:回调创建XMLHttpRequest对象。
xhr()返回值是XHR,提供给jQ使用,即发送数据就是用这个XHR。我们可以通过xhr创建一个回调函数覆盖它,同样返回XHR,但在此绑定onprogress事件。
//jQ源码
1 2 3 |
|
- xhrFields:一对“文件名-文件值”组成的映射,用于设定原生的 XHR对象。
xhrFields属性指向jQ内部创建的XHR,我们可以根据xhrFields获得XMLHttpRequest。由于xhrFields的值只能是json对象,所以不能以下面方式获取。
//错误例子
1 2 3 4 5 6 7 8 |
|
我们可以借助XHR的onsendstart事件,如下:
1 2 3 4 5 6 7 8 9 |
|
2. XMLHttpRequestⅡ(XHR)支持跨域,但需要后台允许。
//后台需发送头部验证
1 2 3 |
|
根据后台给的接口,我需要增加一个参数cros。但我将这个参数与文件同事提交,却提示跨域限制。最后将这个参数放在url才行。
原来XHR跨域是有两次请求的,第一次是验证请求,浏览器根据请求目的地址自动发出options请求。若通过,才能发出自定义的post请求。所以将参数放在post请求里,第一次请求没有cros参数,即不能通过。
以上就是HTML5文件上传插件遇到的技术问题 的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
详细介绍通过HTML5的drag和drop生成拓扑图片base64信息的案例
使用HTML5/css3五步快速制作便签贴特效代码示例分享(图文)
更多相关阅读请进入《HTML5》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者