微信 开发 图片 上传 阿里云 oss 服务器
在做微信开发时,我需要将图片上传至阿里云OSS,思路是服务端下载微信图片再转存至OSS。
wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'],sourceType: ['album', 'camera'],success: function (res) {var localIds = res.localIds;wx.uploadImage({localId: localIds[0], // 需要上传的图片的本地ID,由chooseImage接口获得isShowProgressTips: 1, // 默认为1,显示进度提示success: function (res) {var serverId = res.serverId; // 返回图片的服务器端ID// do something ...// 调用自己搭建的服务端的api,传入serverId,做获取微信图片上传OSS的相关操作doSomething();}});}
});
选择图片时只要选择了compressed,微信就会自动帮我们压缩图片,官方文档也说明上传的多媒体文件会控制格式和大小,其中图片控制在jpg格式和1M以下的大小。所以,基本不用考虑图片过大的问题。实测中,8M的图片压缩后只有120KB左右。
将图片先上传至微信的服务器(最多保存3天),再通过微信的下载多媒体文件接(http://file.api.weixin.qq.com…)将图片下载到服务器,再上传至OSS(虽然有点绕,但可行)。
主要有三种方法处理
1、利用fs
将图片写到本地
const fs = require('fs');
const request = require('require');
const OSS = require('ali-oss').Wrapper;const ossClient = new OSS({accessKeyId: 'your access key',accessKeySecret: 'your access secret',bucket: 'your bucket name',region: 'oss-cn-hangzhou'
});// 需要获取微信accessToken,这里不细说
const accessToken = 'access token';
const mediaId = 'xxxxxxx'; // 微信多媒体文件id
const destPath = `weixin/images/201702/${mediaId}.jpg`; // OSS文件路径,按自己喜欢构造咯
const wxReq = request(`http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=${accessToken }&media_id=${mediaId}`);// 将文件流pipe到本地文件
wxReq.pipe(fs.createWriteStream(`${mediaId}.jpg`));
wxReq.on('end', () => {co(function* () {const result = yield ossClient.putStream(destPath, fs.createReadStream(`${mediaId}.jpg`), {timeout: 30 * 60 * 1000});console.log('图片上传阿里云结果', result);fs.unlink(`${mediaId}.jpg`);// res.status(200).json(result);}).catch(err => {console.warn(err);//res.status(500).send('上传文件出错');});
});
这种方式需要频繁地写文件和删文件,很不友好。
2、利用memory-streams
模块将图片写到内存
const request = require('require');
const OSS = require('ali-oss').Wrapper;
const streams = require('memory-streams');const ossClient = new OSS({accessKeyId: 'your access key',accessKeySecret: 'your access secret',bucket: 'your bucket name',region: 'oss-cn-hangzhou'
});const accessToken = 'access token';
const mediaId = 'xxxxxxx'; // 微信多媒体文件id
const destPath = `weixin/images/201702/${mediaId}.jpg`; // OSS文件路径
const writer = new streams.WritableStream();
const wxReq = request(`http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=${accessToken }&media_id=${mediaId}`);wxReq.pipe(writer);
wxReq.on('end', () => {co(function* () {const result = yield ossClient.put(destPath, writer.toBuffer(), {timeout: 30 * 60 * 1000});console.log('图片上传阿里云结果', result);// res.status(200).json(result);}).catch(err => {console.warn(err);//res.status(500).send('上传文件出错');});
});
这种方式将图片暂存在内存里面,那如果并发量很大,服务器内存爆炸。
3、将下载图片的流直接写入OSS文件
const request = require('require');
const OSS = require('ali-oss').Wrapper;const ossClient = new OSS({accessKeyId: 'your access key',accessKeySecret: 'your access secret',bucket: 'your bucket name',region: 'oss-cn-hangzhou'
});const accessToken = 'access token';
const mediaId = 'xxxxxxx'; // 微信多媒体文件id
const destPath = `weixin/images/201702/${mediaId}.jpg`; // OSS文件路径
const wxReq = request(`http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=${accessToken }&media_id=${mediaId}`);wxReq.on('response', (response) => {// request的响应结果response可以作为读取流传给ossClientco(function* () {const result = yield ossClient.putStream(destPath, response, {timeout: 30 * 60 * 1000});console.log('图片上传阿里云结果', result);// res.status(200).json(result);}).catch(err => {console.warn(err);//res.status(500).send('上传文件出错');});
});
微信 开发 图片 上传 阿里云 oss 服务器相关推荐
- 微信小程序上传阿里云OSS,返回204,400,403,405,解决方案
目录 微信小程序上传阿里云 ==OSSAccessKeyId,policy,signature==如何获取呢? 配置Bucket跨域访问 配置外网域名到小程序的域名白名单 上传报错(返回400,403 ...
- 文件分片上传阿里云OSS
本文参考其他博客并结合自身编写 博客原作者:程序猿谢哥哥 博客原地址:https://blog.csdn.net/weixin_42825651/article/details/108792264 注 ...
- 上传阿里云oss对象型存储 本地文件和上传流上传
上传阿里云oss对象型存储 本地文件和上传流上传 import java.io.ByteArrayInputStream; import java.io.File; import java.io.Fi ...
- NetCore多图片批量上传阿里云OSS,代码可以直接拿过来用
背景 图片上传功能是web开发必不可少的功能.图片上传到哪里其实都是一个非常头疼的事情,多个文件源各种地址组合,经常会出现图片地址错误问题.自从前后端分离.小程序.app成为流行后,大家一般都会将文件 ...
- java利用iText写pdf并上传阿里云OSS并下载
iText是用于生成pdf的一个类库,通过它可以生成pdf或者将XML , HTML转换城pdf模版:阿里云的oss对象存储存储的类型比较多了,可以存储音频 图片 pdf excel 等资源,oss本 ...
- base64格式的图片上传阿里云
base64格式的图片上传阿里云 上传图片的时候,除了普通的图片上传,还有一张图片信息是以base64格式发送到后台的. 后台接受base64格式的图片,上传至阿里云代码:(主要是将base64转化成 ...
- 微信小程序将资源上传阿里云OSS
我们在实际业务中经常能遇到将各种资源上传到云服务器,这样做第一是能更好的管理我们的比如图片资源,视频,音频资源等,同时也能节约公司的网络带宽,减少各种资源随着时间的推移资源越来越多造成服务器的硬盘压力 ...
- 微信小程序上传阿里云视频文件流程及代码
为了微信小程序客服端实现自拍视频能够分享给多个好友,我们需要把小程序自拍的视频存储到服务器,而阿里云在性能和速度上比较不错,所以我们选择了阿里云作服务器. 第一步.微信小程序项目创建 1. 到http ...
- Vue上传阿里云OSS(STS方式)
一.准备工作 1. 开通阿里云OSS服务,从控制台上获取AccessKeyId和AccessKeySecret. 2. 创建Bucket,并登录OSS控制台 3. 配置Bucket (很重要) 将al ...
最新文章
- python多线程爬虫实例-Python3多线程爬虫实例讲解代码
- AttachThreadInput
- 关于django—模型序列化器类详细内容
- DCMTK:DcmAttributeFilter类的测试程序
- DataGrid 功能实现收集(一)
- 2018移动端页面适配-自适应最新方案直接写px--------通过gulp工作流搭建一体化的移动端开发环境
- apache启动错误 AH00072: make_sock: could not bind to address [::]:443
- 文字加减前后缀lisp_LISP 图层前后缀_显示图层的Lisp程式
- 杭电多校HDU 6579 Operation (线性基 区间最大)题解
- 数据结构:邻接表法存储有向图
- 插头dp ——从入门到跳楼
- 牛头刨床设计matlab生成图片,牛头刨床matlab程序---机械原理课程设计
- 计算机网络未识别网络,电脑网络出现未识别的网络,无Internet访问的解决办法...
- Anomalies,Factors,andMultiFactorModels
- 计算机网络(3)--应用层协议--HTTP与HTTPS
- android 背景 投影,Android ImageView投影
- 详解爬虫模拟登陆的三种方法
- 自制F1C200S demo板(六、裸机寄存器点灯)
- java的 finalize() 方法
- Python爬虫爬取美女写真实例
热门文章
- [css] 使用rem时应该注意什么?
- 工作177:表单重置项目处理
- “约见”面试官系列之常见面试题之第一百零五篇之v-if与v-show(建议收藏)
- 前端学习(2033)vue之电商管理系统电商系统之通过路由加载报表
- 前端学习(1165):扩展运算符01
- java学习(160):interrupt方法
- CSS之background-origin属性
- python灰色模型代码_几行代码搞定ML模型,低代码机器学习Python库正式开源
- HTML 禁止数字因被自动识别为手机号,而被添加拨号链接样式
- TextView设置缩略显示