微信小程序对接七牛云存储的方法


Posted in Javascript onJuly 30, 2017

前言:

做小程序有一段时间了,总结一下做过的技术点,特此贡献给小伙伴们!项目中,有图片存储、视频存储、录音存储这三个需要云对接存储。

一、图片/视频/录音上传七牛对接

准备工作:

a、你要有一个七牛账号,实名认证后,在七牛的个人中心,有个秘钥管理-里面有一对秘钥,是上传必须的。这对秘钥,配置在后端,配置时可以设置允许上传格式,也可以设置为任何格式都可上传,让我们的后端大哥去慢慢弄吧。另外,还需要在七牛的对象存储里新建一个存储空间,所要上传的文件就是存储在你创建的空间里,如果你为了方便管理,也可以图片/视频/录音/其他各创建一个存储空间。这个存储空间名字,也要配置在后端的。

b、需要一个上传令牌token,一个文件上传对应一个token,这是必须的。上传令牌token还有时效性,后端配置1h,足以让你完成上传操作就行。这个token由我们自己后端生成,前端调接口获取token,或者像我这样,直接把接口丢在[uptokenURL]后面,七牛的会自己去取。也可以由我们自己先得到token,再丢给七牛。

uptokenURL:'https://get.qiniutoken.com/minibx/geo_f/gain_qn_toke',
uploadURL:'https://up.qbox.me',//华东
uptoken: token,uploadURL:'https://up.qbox.me',//华东

c、七牛的js文件qiniuUploader.js,在下面给的七牛地址里面,可以去下载。里面有个小程序的SDK,解压找到里面的qiniuUploader.js,在你需要上传的页面,导入这个js。https://developer.qiniu.com/sdk#community-sdk

1、图片上传七牛

通过小程序的方法,为用户提供添加本地图片,或者拍照,之后你会得到方法返回的图片临时路径。我们可以把图片维护在一个数组里,这样在上传七牛时,以队列的形式上传。

constqiniuUploader = require("../../libs/qiniuUploader.js");

var sourceType = [['camera'], ['album'], ['camera','album']];

var sizeType = [['compressed'], ['original'], ['compressed','original']];

var imageArray = [];// 点击事件,从本地相册选择图片或使用相机拍照。

chooseImage: function (e) {

var that =this;

wx.chooseImage({

sourceType: sourceType[this.data.sourceTypeIndex],


sizeType: sizeType[this.data.sizeTypeIndex],


count:this.data.count[this.data.countIndex],//这个count可以用来删除当前图片


success: function (res) {


// 返回照片的本地文件路径,tempFilePath可以作为img标签的src属性显示图片vartempFilePaths = res.tempFilePaths;


imageArray.push(tempFilePaths);


that.setData({


imageList: tempFilePaths


})


that.pictureUploadqiniuMethod(imageArray,"tupian_");


},

})

},

//得到图片路径数组后,准备上传七牛

pictureUploadqiniuMethod: function (imageArray, fileHead){

var that =this;

for(vari =0; i < imageArray.length; i++) {

  var filePath = imageArray[i];


var imgName = filePath.substr(30,50);


qiniuUploader.upload(filePath, (res) => {


//上传成功,上传成功一张图片,进入一次这个方法,也就是返回一次


 console.log(res)

},

(error) => {

  //图片上传失败,可以在七牛的js里面自己加了一个err错误的返回值console.log('error: '+ error)

},

{


domain:'oqxfq54dn.bkt.clouddn.com',

  uptokenURL:'https://get.qiniutoken.com/minibx/geo_f/gain_qn_token',


uploadURL:'https://up.qbox.me',//华东key: fileHead + imgName,// 自定义文件 keyregion:'ECN',

});

}

},

红线框内的这块代码,是七牛qiniuUploader.js文件里的,我加了一个if判断,为了防止虽然上传成功,但没有返回data,这样在代码112行获取返回data时,不至于直接报错。

微信小程序对接七牛云存储的方法 

 解释::

imageArray:准备上传的图片临时地址数组。

fileHead:自定义上传七牛文件名的头,为了区别上传文件,比如图片/视频/录音/其他,

imgName:自定义上传七牛文件名,前端处理嘛,我就简单的通过截取临时路径(filePath )的30-50位字符作为储存到七牛的文件名,即使你添加了两张相同的图片,小程序给你的临时路径也是不一样的,所以不会存在重名情况。

domain:下载资源时用到。如果设置,在上传后的success里返回的res.ImageURL字段,是一个带http的直接可以访问的文件地址,否则需要自己拼接。

key:最终储存到七牛的文件名,我这里的图片文件名=文件头(fileHead)+伪文件名(imgName)

uploadURL:上传到七牛的那个存储区域,上传区域和上传区域代码一定要对应上。

region:上传区域代码。

shouldUseQiniuFileName:表示是否由七牛来定义上传文件名,如果是 true,则文件 key 由 qiniu 服务器分配 (全局去重)。默认是 false,也就是我们自己来定义。如果key设置了,优先级最高。

七牛存储区域表:

微信小程序对接七牛云存储的方法

这样,在需要上传页面调用七牛的qiniuUploader.js,就可以上传了。

 会遇到的问题: 

某张图片/视频/录音上传失败可能的原因:

①上传文件不是后端所允许的大小,图片一般小于3M。视频/录音我限制是小于1M 

②上传文件格式在后端没有被允许。

③token获取失败,比如我遇到的,七牛的qiniuUploader.js文件通过接口获取token,默认是这样[var token = res.data.token;],而我们后端接口返回的token是这样

微信小程序对接七牛云存储的方法

所以我需要在七牛的js文件里修改为[var token = res.data.extra;],要么让后端改。

2、视频上传七牛

视频上传和图片上传是一个套路,只是文件格式不同,视频一般就一个文件,不像图片有多张,需要搞个队列来上传。所以上传视频就这样:

//事件绑定,添加视频

chooseVideo: function (res) {

var that =this;


wx.chooseVideo({



sourceType: sourceType[this.data.sourceTypeIndex],



camera: camera[this.data.cameraIndex],



maxDuration: duration[this.data.durationIndex],



success: function (res) {



var shipinFile= res.tempFilePath;



that.setData({



src: shipinFile


});

  
//用户寻选择好图片后,调用上传方法




that.shipinUploadqiniuMethod(shipinFile,"shipin_");



}


})

},

//视频上传七牛

shipinUploadqiniuMethod: function (shipinFile, fileHead){



var that =this;



var shipinName = shipinFile.substr(30,50);




qiniuUploader.upload(shipinFile, (res) => {



//视频上传成功console.log(res)


},


(error) => {



//视频上传失败,可以在七牛的js里面自己加了一个err错误的返回值



console.log('error: '+ error)


},


{



domain:'oqxfq54dn.bkt.clouddn.com',




uptokenURL:'https://get.qiniutoken.com/minibx/geo_f/gain_qn_token',




uploadURL:'https://up.qbox.me',//华东



key: fileHead + shipinName ,// 自定义文件 keyregion:'ECN',//华东区域代码});


}

},

3、录音文件上传七牛

小程序的录音格式为silk,录音上传七牛,可以和视频共用一个方法。但虽然上传成功了,状态码为403,七牛没有返回data,像这样:

微信小程序对接七牛云存储的方法

 正常上传时,能正常返回data,并且状态码是200

微信小程序对接七牛云存储的方法

后端配置silk格式允许,这样应该是没问题的。

微信小程序对接七牛云存储的方法

上传成功七牛却没有返回data,这个data里有文件传七牛那边在线地址,不返回我们怎么访问了。现在的处理是:把音频文件传到自己服务器。目前就只能这么办了。

这里是小程序对接七牛云存储的官方文档:

https://github.com/gpake/qiniu-wxapp-sdk/blob/master/README.md?ref=developer.qiniu.com

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js下拉菜单语言选项简单实现
Sep 23 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
简单谈谈node.js 版本控制 nvm和 n
Oct 15 Javascript
JS匿名函数类生成方式实例分析
Nov 26 Javascript
jQuery实现可拖动进度条实例代码
Jun 21 jQuery
使用vue构建移动应用实战代码
Aug 02 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
详解Vue 多级组件透传新方法provide/inject
May 09 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
Apr 28 Javascript
JS+CSS实现过渡特效
Jan 02 Javascript
vue实现验证用户名是否可用
Jan 20 Vue.js
微信小程序tab左右滑动切换功能的实现代码
Feb 08 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 #Javascript
Vue自定义指令详解
Jul 28 #Javascript
ReactNative踩坑之配置调试端口的解决方法
Jul 28 #Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 #Javascript
Vue单文件组件的如何使用方式介绍
Jul 28 #Javascript
VUE axios上传图片到七牛的实例代码
Jul 28 #Javascript
jQuery dateRangePicker插件使用方法详解
Jul 28 #jQuery
You might like
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
layui中table表头样式修改方法
2018/08/15 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
如何通过python画loss曲线的方法
2019/06/26 Python
python模拟实现分发扑克牌
2020/04/22 Python
Python 存取npy格式数据实例
2020/07/01 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
物流毕业生个人的自我评价
2014/02/13 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
2015年药店工作总结
2015/04/20 职场文书
暂停营业通知
2015/04/25 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
妈妈别哭观后感
2015/06/08 职场文书
八一建军节主持词
2015/07/01 职场文书
初中政治教学工作总结
2015/08/13 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python