前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Web直传OSS

Web直传OSS

作者头像
wade
发布2020-04-24 17:00:02
20.7K0
发布2020-04-24 17:00:02
举报
文章被收录于专栏:coding个人笔记coding个人笔记

最近公司需求,前端直接传图片到OSS,一般我们都是传到服务器后台,然后由后台存储。这样其实有一些缺点,OSSAPI上面说:

1、 上传慢。先上传到应用服务器,再上传到OSS,网络传送多了一倍。如果数据直传到OSS,不走应用服务器,速度将大大提升,而且OSS是采用BGP带宽,能保证各地各运营商的速度。

2、 扩展性不好。如果后续用户多了,应用服务器会成为瓶颈。

3、 费用高。由于OSS上传流量是免费的。如果数据直传到OSS,不走应用服务器,那么将能省下几台应用服务器。

在这边不得不吐槽一下OSS的API,是真的很烂,基本找不到好的方法,都是基于百度才做出来的,当然,我使用的方法估计还有一些坑,只是能实现了我的功能。

首先是引入OSS的SDK,本来使用npm安装,但是import失败,还是使用script引入。API上面直接new OSS,使用了,直接报错,要调用Wrapper方法。

let storeAs = `meichujia/{new Date().getTime()}{file.name}`;var client = new OSS.Wrapper({ region: 'oss-cn-hangzhou', accessKeyId: that.ossConfig.AccessKeyId, accessKeySecret: that.ossConfig.AccessKeySecret, stsToken: that.ossConfig.SecurityToken, bucket: 'yp-images', secure: true});client.put(storeAs, buffer).then(function (result) { console.log(result);

}).catch(function (err) { console.log(err); });

storeAs:存储的路径和名字。

Region:地区选择,默认这个。

accessKeyId、accessKeySecret、stsToken:临时凭证,后台获取。

Bucket:上传的位置。

Secure:(很重要)允许HTTPS,因为这个原因花了好长时间。

client.put:方法,还有一个multipartUpload方法,只能传file对象,因为要压缩,压缩后变成blob对象上传不了,我写的测试put方法blob对象也无法上传,要转成buffer对象才能上传。

成功后有回调函数,就可以在回调函数里面操作了。

附上压缩图片方法:file:文件对象,quality:0-1,压缩质量,fn:回调函数,也就是blob对象

代码语言:javascript
复制
fileResizetoFile(file,quality,fn){
  filetoDataURL (file,function(dataurl){
    dataURLtoImage(dataurl,function(image){
      canvasResizetoFile(imagetoCanvas(image),quality,fn);
    })
  })

  function filetoDataURL(file,fn){
    var reader = new FileReader();
    reader.onloadend = function(e){
      fn(e.target.result);
    };
    reader.readAsDataURL(file);
  }

  function dataURLtoImage(dataurl,fn){
    var img = new Image();
    img.onload = function() {
      fn(img);
    };
    img.src = dataurl;
  }

 function canvasResizetoFile(canvas,quality,fn){
    canvas.toBlob(function(blob) {
      fn(blob);
    },'image/jpeg',quality);
  }

  function imagetoCanvas(image){
    var cvs = document.createElement("canvas");
    var ctx = cvs.getContext('2d');
    cvs.width = image.width;
    cvs.height = image.height;
    ctx.drawImage(image, 0, 0, cvs.width, cvs.height);
    return cvs ;
  }
}
直接调用
fileResizetoFile(file, 0.1, (res) => {
//res就是压缩后的blob对象
  var buffer = '';
  // blob转ArrayBuffer
  var reader = new FileReader();
  reader.readAsArrayBuffer(res);
  reader.onload = function (event) {
    // 转Buffer
    buffer = new OSS.Buffer(event.target.result);
  }
});
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档