如何判断文件是否上传成功?

默认如果啥也不处理,只要有返回数据就认为是成功,就算返回的是错误信息,也认为是成功了。

但是,在认为成功前会派送一个事件uploadAccept,这个事件是用来询问是否上传成功的。 在这个事件中你可以拿到上传的是哪个文件,以及对应的服务端返回reponse。

response是个对象,如果服务器返回是json格式,那么正和你意,都已经解析好了, 如果不是json格式,response._raw里面可以拿到原始数据。所以,webuploader对于后端返回的数据格式是没有要求的。

 

应用于移动端注意事项

webuploader 是满足 ios 6+, android 4+ 的。

目前移动端有几个重要的 bug 在此列出来以免大家踩坑。

  1. 上传请求内容为空,这是 android 4 的一个bug,只要 file 的 blob数据修改过,通过 xhr2 去发送就有这个问题。 详情:https://code.google.com/p/android/issues/detail?id=39882

    解决方案: 发送的时候采用二进制方案,即 把 sendAsBinary 设置成true, 通过这种方式可以避免这个问题。后端接受需要小改动一下。

  2. 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接口呢?

对于秒传来说,其实就是文件上传前,把内容读取出来,算出md5值,然后通过ajax与服务端验证进行验证, 然后根据结果选择继续上传还是掉过上传。

像这个操作里面有两个都是异步操作,文件内容blob读取和ajax请求。所以这个handler必须是异步的,怎样告诉组件此handler是异步的呢?只需要在hanlder里面返回一个promise对象就可以了,这样webuploader就会等待此过程,监听此promise的完成事件,自动继续。

以下是此思路的简单实现。

关于断点续传

其实就是秒传分片,跟秒传整个文件是一个思路。关于md5验证这块,可以ajax请求验证,也可以在文件秒传验证的时候,把已经成功的分片md5列表拿到,这样分片验证的时候就只需要本地验证就行了,减少请求数。

具体实现和思路请查看这里#139

 

常见 flash 报错原因

  1. flash 版本太低,请至少大于等于 11.4,低于此版本请提示更新 flash 版本

  2. 按钮或者他的父级被设置 display:none 隐藏了,在这种情况下 flash 会停止运行,请改用以下方式隐藏,给 需要隐藏的元素加 webuploader-element-invisible 类名代替加 display:none 属性。

  3.