我写博客都不太喜欢配图片, 主要是配置上图片的话很难管理那些图片, 第三方的图床也不太靠谱, 怕挂了然后九GG咯, 自己服务器呢又难的迁移, 速度还慢呢. 所以还是自己去申请一个对象储存来玩玩吧, 网易云呢我是很早以前申请的, 以前是50G的免费容量吧, 然后流量每个月多少来着反正我用不完那种. 废话不多说了, 申请认证账户那些九不多说, 我直接开始代码部分
首先看了下网易云nos文档, 还是老样子, 后端生成临时的token, 前端带上token上传, 相比于七牛就是他这需要把保存的对象名给生成到token中进行验证, 所以生成这个token只能上传一个文件, 倒是安全了许多嘛.
node 生成token
还是老样子, AppKey 还有一些必要参数base64编码后, HMAC-SHA1加上SecretKey加密在base64编码就行.
好了直接上代码, node加密还是要安装一个 crypto 加密库
1 | npm install crypto |
1 | const crypto = require('crypto') |
就普通的加密编码, 现在的这几家签名方案真的一点都没啥变化, 接入的多了完全真的就感觉很简单咯.
后端获取并拼接上传地址
接着往下翻文档, enn 需要请求地址获得那啥上传的api接口…, 还是后端搞这些, 连着签名一起给前端吧, 这样的话那就还需要一个axios来发起网络请求
1 | npm insatll axios |
1 | const http = require('axios) |
这个地址我们也获取到了, 现在就就这看文档吧
注意上面我标记那有个坑, 他说的用那个地址, 其实不然, host应该为上面我们通过接口获得的两个地址, 优先取第一个, 我在这就试了很多遍, 结果还是踩了好几次坑才慢慢搞好的, 就按照这个来吧, 讲真他这个文档坑真的挺多的, 百度也没啥东西, 还好多试试就能解决.
我这里的想法是后端直接把地址拼接好, 然后前端直接往地址上put文件就好, 先我们来搞一下普通的小文件上传, 那些非必要的参数就先不管
1 | ... |
按照文档上来上面那是一点毛病都没有, 但是按照文档上来你真的就输了, 注意下面这句话
该分块在整个文件中的偏移,如果断点续传,可以使用查询接口获取offset ,如返回CommandNotFound,建议加offset=0
反正我一上传就给我报 CommandNotFound
这个参数本来是他分片才需要的, 但是就算你传一个问题也会给你报错, 所以默认还是带上这个把
1 | ... |
小文件直传
OK, 有了这个地址和token我们就可以直接上传文件到nos里面了, 下面我就直接写操作file的内容了, 至于怎么获得input的files可以看我以前写的那个axios上传文件到七牛云那篇文章.
1 | // 我们这里还是导入axios来上传 |
分片上传的实现
好像就这样就完成了嘛, 是不是非常简单嘛, 其实就是这样简单, 不过这里进度我没有写, 还有实测这b玩意儿大于4m就传不上去咯, 单片文件只能传4m一下, 所以我们就需要搞那个分片上传了嘛, 首先我们来瞅瞅分片上传需要的参数
offset 该分块在整个文件中的偏移,如果断点续传,可以使用查询接口获取offset ,如返回CommandNotFound,建议加offset=0
complete 是否是最后一片,如果是则为true,不是为false
context 上传上下文。本字段是只能被上传服务器解读使用的不透明字段,上传端不应修改其内容。用户不带此参数表示是第一次上传,之后上传剩余部分数据都需要带上这个参数。 context对应的桶名或者对象名不匹配返回400 code。
这个样子的话, 我们接口就还需要改动一下嘛..
1 | ... |
接口改造完成, 可以接着来前端实现了, 先理一下思路, 他这个续传需要一个第一次上传给的context
, 所以开始就不能并发调用, emmm, 至于后面的全并发调用还是不搞了把, 进度不好控制. 那就递归循环调用, 一片一片的接力赛慢慢上传. ok, 那就需要封装一个方法来调用自身嘛
1 | ... |
实在是炒鸡简单啦有某有, 不过实现起来还是不容易, 坑还是蛮多的, 就比如最后第一次上传我没带对象,,,,, 里面的参数一直取不到值, 一直报啥未定义….emmm. 最后好像我们还差一个进度嘛
进度实现
进度的话去看看axios的文档就晓得咯, 就是一个事件函数来处理的
// `onUploadProgress` 允许为上传处理进度事件
onUploadProgress: function (progressEvent) {
// 对原生进度事件的处理
}
1 | ... |
emmm. 好像还没有那个啥对象的地址, 其实就那个生成的ObjectName加上配置的地址