使用第三方总是非常麻烦的,这里使用uniapp的条件编译,给大家带来 微信小程序的上传图片以及H5的上传图片 到腾讯云COS

毕竟文档很难看,由于进行了封装,在最后再显示完整代码

首先解决H5的上传

我这里看的文档是
链接: https://cloud.tencent.com/document/product/436/64960

使用的是putObject,准备好以下数据Bucket和Region,以及创建一个cos对象,这些数据如果是自己创建的存储桶都知道的,不是自己创建的找后端或者项目经理拿

// #ifdef H5
import COS from 'cos-js-sdk-v5';
// #endif
// #ifdef MP-WEIXIN
import COS from 'cos-wx-sdk-v5'
// #endif
const Bucket = ""; /* 填入您自己的存储桶,必须字段 */
const Region = ''; /* 存储桶所在地域,例如ap-beijing,必须字段 */
const cos = new COS({SecretId: '',SecretKey: '',
})
1.在选完图片之后,先看看返回来的数据是什么格式的

使用putObject进行上传,但是,这个Api要求传入的文件是File对象或者Blob对象

别问我为什么支持字符串不用字符串,问就是试过,但不行,还是老老实实转File对象和Blob对象吧

如果返回来的数据格式是以上两种中的一种,那皆大欢喜,不是就用以下方法转

(a)如果是base64转Blob对象 用以下方法:
// base64转blob
function parseBlob(dataurl) {var arr = dataurl.split(',');var mime = arr[0].match(/:(.*?);/)[1];var bstr = atob(arr[1]);var n = bstr.length;var u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], { type: mime });
}
(b)如果是Blob Url(Blob的string)转File对象用以下方法:
function parseFile(src,name) {let that = thisreturn new Promise((resolve, reject) => {let xhr = new XMLHttpRequest()xhr.open('GET', src, true)xhr.responseType = 'blob'xhr.onload = function (e) {if (this.status == 200) {let myBlob = this.responselet files = new window.File([myBlob],name,{ type: myBlob.type }) // myBlob.type 自定义文件名resolve(files)} else {reject(false)}}xhr.send()})
}
2.上传

我这里返回来的是base64,就用(a)方法了,点击上传,我这里是自己传的一个文件名,如:xxx.jpg

// 随机生成字符串做名字
function getRandomString(len,type){let _charStr = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',min = 0, max = _charStr.length-1, _str = '';                    //定义随机字符串 变量//判断是否指定长度,否则默认长度为15len = len || 15;//循环生成字符串for(var i = 0, index; i < len; i++){index = (function(randomIndexFunc, i){         return randomIndexFunc(min, max, i, randomIndexFunc);})(function(min, max, i, _self){let indexTemp = Math.floor(Math.random()*(max-min+1)+min),numStart = _charStr.length - 10;if(i==0&&indexTemp >=numStart){indexTemp = _self(min, max, i, _self);}return indexTemp;}, i);_str += _charStr[index];}return _str + '.' + type
},
//H5上传
function h5UploadFile(blob,fileName) {//上传图片return new Promise(function(resolve, reject) {cos.putObject({Bucket: Bucket, Region: Region,  Key: `/image/${fileName}`,Body: blob,}, function(err, data) {//data里有返回来的图片地址数据console.log(err || data);resolve(data.Location)});})
},
uploadImage(event) {//event.url 是我要上传到腾讯云的临时地址let blob = parseBlob(event.url)//图片格式如 pngconst imageType = blob.type.split('/')[1]; //生成名字如 asdahfskjh.pnglet fileName = getRandomString(30,imageType)//这里result就是返回来的上传到腾讯云后的图片地址const result = await h5UploadFile(blob,fileName);
}

然后是小程序上传

小程序上传其实更为简单,使用的是postObject,Bucket、region和cos对象都和H5一致,只需要一个方法就行,不需要转File对象或者Blob对象

 function wxUploadFile(filePath,fileName) {return new Promise(function(resolve, reject) {cos.postObject({Bucket: Bucket, /* 必须 */Region: Region,    /* 必须 */Key:  `/image/${fileName}`,              /* 必须 */FilePath: filePath,onProgress: function (info) {console.log("[cos.postObject-seccess]",JSON.stringify(info));} }, function(err, data) {console.log("[cos.postObject-err]",err || data);resolve(data.headers.location)});})
},
uploadImage(event) {//event.url 是我要上传到腾讯云的临时地址let filePath = event.url;let fileName = filePath.substr(filePath.lastIndexOf('/') + 1);const result = await wxUploadFile(filePath,fileName)
}

3.完整代码如下

把上传所需要的方法封装成一个JS文件:attachment.js,方便后续使用
attachment.js

// #ifdef H5
import COS from 'cos-js-sdk-v5';
// #endif
// #ifdef MP-WEIXIN
import COS from 'cos-wx-sdk-v5'
// #endifconst Bucket = ""; /* 填入您自己的存储桶,必须字段 */
const Region = ''; /* 存储桶所在地域,例如ap-beijing,必须字段 */
const cos = new COS({SecretId: '',SecretKey: '',
})// #ifdef H5
export function h5UploadFile(blob,fileName) {//上传图片return new Promise(function(resolve, reject) {cos.putObject({Bucket: Bucket, Region: Region,  Key: `/image/${fileName}`,Body: blob,}, function(err, data) {console.log(err || data);resolve(data.Location)});})
}// base64转blob
export function parseBlob(dataurl) {var arr = dataurl.split(',');var mime = arr[0].match(/:(.*?);/)[1];var bstr = atob(arr[1]);var n = bstr.length;var u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], { type: mime });
}// 随机生成字符串做名字
export function getRandomString(len,type){let _charStr = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',min = 0, max = _charStr.length-1, _str = '';  //定义随机字符串 变量//判断是否指定长度,否则默认长度为15len = len || 15;//循环生成字符串for(var i = 0, index; i < len; i++){index = (function(randomIndexFunc, i){         return randomIndexFunc(min, max, i, randomIndexFunc);})(function(min, max, i, _self){let indexTemp = Math.floor(Math.random()*(max-min+1)+min),numStart = _charStr.length - 10;if(i==0&&indexTemp >=numStart){indexTemp = _self(min, max, i, _self);}return indexTemp;}, i);_str += _charStr[index];}return _str + '.' + type
}//bolburl转file
export function parseFile(src,name) {let that = thisreturn new Promise((resolve, reject) => {let xhr = new XMLHttpRequest()xhr.open('GET', src, true)xhr.responseType = 'blob'xhr.onload = function (e) {if (this.status == 200) {let myBlob = this.responselet files = new window.File([myBlob],name,{ type: myBlob.type }) // myBlob.type 自定义文件名resolve(files)} else {reject(false)}}xhr.send()})
}
// #endif// #ifdef MP-WEIXIN
export function wxUploadFile(filePath,fileName) {return new Promise(function(resolve, reject) {cos.postObject({Bucket: Bucket, /* 必须 */Region: Region,    /* 必须 */Key:  `/image/${fileName}`,  /* 必须 */FilePath: filePath,onProgress: function (info) {console.log("[cos.postObject-seccess]",JSON.stringify(info));} }, function(err, data) {console.log("[cos.postObject-err]",err || data);resolve(data.headers.location)});})
}
// #endif

使用的页面的methods

// 上传图片
import {h5UploadFile,wxUploadFile,parseBlob,getRandomString} from '@/api/attachment.js'
export deafault {methods: {async uploadImage(event) {// 将图片上传到腾讯云// #ifdef H5let blob = parseBlob(event.url)const imageType = blob.type.split('/')[1];let fileName = getRandomString(30,imageType)const result = await h5UploadFile(blob,fileName);// #endif// #ifdef MP-WEIXINlet filePath = event.url;let fileName = filePath.substr(filePath.lastIndexOf('/') + 1);const result = await wxUploadFile(filePath,fileName)// #endif}}
}
最后,其实那个fileName随你们自己定义,这个没有那么重要,拿到result之后自己复制到浏览器看看能不能查看,能查看就是上传成功了。

uniapp上传图片到腾讯云COS相关推荐

  1. uni-app上传图片到腾讯云

    uni-app上传图片到腾讯云(对象存储) 客户端,先从后端请求到上传的链接,再直接上传图片到腾讯云的对象存储. 1.文件base-util.js的内容: function chooseImageFr ...

  2. 微信小程序/网站 上传图片到腾讯云COS

    COS简介: 腾讯云提供的一种对象存储服务,供开发者存储海量文件的分布式存储服务.可以将自己开发的应用的存储部分全部接入COS的存储桶中,有效减少应用服务器的带宽消耗等.个人也可以通过腾讯云账号免费使 ...

  3. 使用微信js sdk关于选择及上传图片至腾讯云COS

    使用微信js sdk关于选择及上传图片至腾讯云COS 使用微信js sdk关于选择及上传图片至腾讯云COS 背景 名词 参考 效果图展示 开发步骤 1:概要步骤 2:上代码 结束: 使用微信js sd ...

  4. 腾讯云服务器怎么搭建ssm项目,SSM 项目如何上传图片到腾讯云COS?

    -------------------- 个人博客上已经同步更新了文章,有目录索引,阅读起来比较方便,欢迎大家移步个人博客上读阅~ 个人博客地址:[http://zwd596257180.gitee. ...

  5. (Ⅲ)使用七牛云作为图床获取外链方式总结(已更换为使用PicGO+腾讯云COS)

    1. 图床的选择 (1) 什么是图床? 很多技术人写作都有在用 Markdown 轻量级标记语言进行博客写作,这种写作让我们不用像使用 Word 那么麻烦调整排版和格式,而只需专心写作照样完成排版的一 ...

  6. (Ⅲ)使用七牛云作为图床获取外链方式总结(已更换为使用PicGO+腾讯云COS)...

    1. 图床的选择 (1) 什么是图床? 很多技术人写作都有在用 Markdown 轻量级标记语言进行博客写作,这种写作让我们不用像使用 Word 那么麻烦调整排版和格式,而只需专心写作照样完成排版的一 ...

  7. 微信小程序---腾讯云cos的使用---前端上传图片+后端生成临时密钥

    0. 腾讯云cos介绍: - 第一阶段:文件服务器,将文件存储在某个服务器(目录结构的划分). - 第二阶段:- 文件存储,将文件存储在某个服务器(目录结构的划分).- 对象存储,优化存储和操作优化( ...

  8. 图片上传成功但是图片显示不出来_小程序上传图片到腾讯云

    这是小程序开发第二篇,主要介绍如何上传图片到腾讯云,之所以选择腾讯云,是因为腾讯云免费空间大 准备工作 上传图片主要是将图片上传到腾讯云对象存储(COS). 要使用对象存储 API,需要先执行以下步骤 ...

  9. 腾讯云COS全球加速让全球用户加速访问

      一.市场需求 移动互联网时代,各类文本.图片.音视频数据一直随时随地通过网络基础设施传输到服务器上.但不同终端所处的网络基础设施.网络流量和网络环境各有差异,当用户处于弱网环境下时,数据传输可能出 ...

最新文章

  1. Exchange邮件服务器实现外部邮件的收发
  2. input onclick=window.location.href='https://www'不能跳转问题。
  3. Opencv判断是否加载图片的两种方法
  4. 下载 | 9G火爆的Python爬虫教程+ 520页《图解机器学习》
  5. i5 11300h和R5 5600H 参数对比哪个好
  6. Dart 3-Day
  7. mysql gtid模式主键主突_Mysql基于GTID主从复制
  8. 2021年安徽庐江中学朱天乐高考成绩查询,庐江中学举行2021届高三大型励志报告会...
  9. python入门安装
  10. 凸优化第二章凸集 2.4广义不等式
  11. 网友发给我一个游戏钓鱼网站,我用python渗透了该网站所有信息!
  12. ORB-SLAM2源码阅读(四)—LoopClosing线程SIM3变换
  13. 2018纪中夏季信息学集训总结
  14. 架构设计(7)—如何设计一个架构
  15. C语言指针中P、*P、P、**P的区别
  16. 关于\xEF\xBB\xBF的介绍
  17. 血气方刚的年轻小伙竟去做家政小哥,是怎样成功逆袭转行的
  18. 千锋和蓝欧html5,蓝鸥零基础学习HTML5第六讲 CSS的常见样式
  19. 一位明星证券客户经理的十年辛酸史--俊材有话说
  20. iOS进度条 自定义圆角 UIProgressView

热门文章

  1. 2012年3月份第4周51Aspx源码发布详情
  2. 线上中国美食图鉴:舌尖上的家乡味道
  3. 网络调试助手UDP广播问题
  4. vue基础知识练习整理2
  5. 安卓手机可以连接斑马系统吗_阿里和上汽:重组斑马打造车联网安卓系统
  6. MySQL concat、concat_ws、group_concat 用法
  7. A ConvNet for the 2020s的总结
  8. 如何爬blob:htttp://开头的视频
  9. 清新脱俗的TensorFlow CIFAR10例程的代码重构——更简明更快的数据读取、loss accuracy实时输出
  10. 更精确SSR的交点检测