默认如果啥也不处理,只要有返回数据就认为是成功,就算返回的是错误信息,也认为是成功了。
但是,在认为成功前会派送一个事件uploadAccept,这个事件是用来询问是否上传成功的。 在这个事件中你可以拿到上传的是哪个文件,以及对应的服务端返回reponse。
xuploader.on( 'uploadAccept', function( file, response ) {
if ( hasError ) {
// 通过return false来告诉组件,此文件上传有错。
return false;
}
});
response是个对象,如果服务器返回是json格式,那么正和你意,都已经解析好了, 如果不是json格式,response._raw里面可以拿到原始数据。所以,webuploader对于后端返回的数据格式是没有要求的。
webuploader 是满足 ios 6+, android 4+ 的。
目前移动端有几个重要的 bug 在此列出来以免大家踩坑。
上传请求内容为空,这是 android 4 的一个bug,只要 file 的 blob数据修改过,通过 xhr2 去发送就有这个问题。 详情:https://code.google.com/p/android/issues/detail?id=39882
解决方案: 发送的时候采用二进制方案,即 把 sendAsBinary 设置成true, 通过这种方式可以避免这个问题。后端接受需要小改动一下。
jpeg 压缩后体积反而变大了,这是 android 的另外一个 bug, canvas.toDataUrl 不支持 jpeg编码,实际上采用的 png 编码。详情: https://code.google.com/p/android/issues/detail?id=39885
解决方案:引入了一个 jpeg js压缩库,在不支持的的情况下采用此库。但是此库默认没有打包进来,需要自行配置打包方案,将 runtime/html5/androidpatch.js 打包进来。
因为这是小众需求,所以默认没有做在webuploader里面,而只是提供hook接口,让用户很简单的扩展此功能。
那么,都有哪些重要的hook接口呢?
before-send-file
此hook在文件发送之前执行before-file
此hook在文件分片(如果没有启用分片,整个文件被当成一个分片)后,上传之前执行。after-send-file
此hook在文件所有分片都上传完后,且服务端没有错误返回后执行。对于秒传来说,其实就是文件上传前,把内容读取出来,算出md5值,然后通过ajax与服务端验证进行验证, 然后根据结果选择继续上传还是掉过上传。
像这个操作里面有两个都是异步操作,文件内容blob读取和ajax请求。所以这个handler
必须是异步的,怎样告诉组件此handler
是异步的呢?只需要在hanlder
里面返回一个promise对象就可以了,这样webuploader就会等待此过程,监听此promise的完成事件,自动继续。
以下是此思路的简单实现。
xxxxxxxxxx
Uploader.register({
'before-send-file': 'preupload'
}, {
preupload: function( file ) {
var me = this,
owner = this.owner,
server = me.options.server,
deferred = WebUploader.Deferred();
owner.md5File( file.source )
// 如果读取出错了,则通过reject告诉webuploader文件上传出错。
.fail(function() {
deferred.reject();
})
// md5值计算完成
.then(function( md5 ) {
// 与服务安验证
$.ajax(server, {
dataType: 'json',
data: {
md5: ret
},
success: function( response ) {
// 如果验证已经上传过
if ( response.exist ) {
owner.skipFile( file );
console.log('文件重复,已跳过');
}
// 介绍此promise, webuploader接着往下走。
deferred.resolve();
}
});
});
return deferred.promise();
}
});
其实就是秒传分片,跟秒传整个文件是一个思路。关于md5验证这块,可以ajax请求验证,也可以在文件秒传验证的时候,把已经成功的分片md5列表拿到,这样分片验证的时候就只需要本地验证就行了,减少请求数。
具体实现和思路请查看这里#139
flash 版本太低,请至少大于等于 11.4,低于此版本请提示更新 flash 版本
按钮或者他的父级被设置 display:none 隐藏了,在这种情况下 flash 会停止运行,请改用以下方式隐藏,给 需要隐藏的元素加 webuploader-element-invisible
类名代替加 display:none
属性。
xxxxxxxxxx
.webuploader-element-invisible {
position: absolute !important;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px,1px,1px,1px);
}