关于上传,总是有很多可以说道的。
16年底,公司项目的前端部分,开始了从传统的jquery
到vue 2.0
的彻底重构。但是上传部分,无论是之前的传统版本,还是Vue
新版本,都是在使用着这款优秀的开源库,只是进行了简单的directive
化。为什么呢?因为兼容性。没办法,公司项目不等同于个人项目,必须要考虑大多数浏览器。否则,上传部分完全可以利用Vue-Resource
以及FormData
来抛开对的依赖。这让我深感遗憾,幸好这个简单的遗憾在个人博客Vue
化重构的时候得以弥补。 上传流程
图不重要看文字
input[type="file"]
change
事件触发后,先去(如果是图片,可以同时通过FileReader
以及readAsDataURL
将图片预览在页面上)后台请求七牛的上传token
,将拿到的token
和key
以及通过change
传递过来的files
一起append
到formData
中。然后将formData
通过post
传递给七牛,七牛在处理后将返回真正的文件地址 获取token
const qiniu = require('qiniu')const crypto = require('crypto')const Config = require('qiniu-config')exports.token = function*() { //构建一个保存文件名 //这里没有处理文件后缀,需要自己传递过来,然后在这里处理加在key上,非必须 const key = crypto.createHash('md5').update(((new Date()) * 1 + Math.floor(Math.random() * 10).toString())).digest('hex') //Config 七牛的秘钥等配置 const [ACCESS_KEY, SECRET_KEY, BUCKET] = [Config.accessKey, Config.secretKey, Config.bucket] qiniu.conf.ACCESS_KEY = ACCESS_KEY qiniu.conf.SECRET_KEY = SECRET_KEY const upToken = new qiniu.rs.PutPolicy(BUCKET + ":" + key) try { const token = upToken.token() return this.body = { key: key, token: token } } catch (e) { // throw error }}//假设api 地址是 /api/token
上传组件 upload.vue
父组件调用
... 选择图片文件 ...
小结
相比于FILEApi
或者其他上传组件,这种方法代码量最小。但是缺点也是显而易见的,大量html5 API
的使用,势必会回到兼容性这个老大难上来,慎重的选择性使用吧
本文首发于