在做微信开发时,我需要将图片上传至阿里云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 服务器相关推荐

  1. 微信小程序上传阿里云OSS,返回204,400,403,405,解决方案

    目录 微信小程序上传阿里云 ==OSSAccessKeyId,policy,signature==如何获取呢? 配置Bucket跨域访问 配置外网域名到小程序的域名白名单 上传报错(返回400,403 ...

  2. 文件分片上传阿里云OSS

    本文参考其他博客并结合自身编写 博客原作者:程序猿谢哥哥 博客原地址:https://blog.csdn.net/weixin_42825651/article/details/108792264 注 ...

  3. 上传阿里云oss对象型存储 本地文件和上传流上传

    上传阿里云oss对象型存储 本地文件和上传流上传 import java.io.ByteArrayInputStream; import java.io.File; import java.io.Fi ...

  4. NetCore多图片批量上传阿里云OSS,代码可以直接拿过来用

    背景 图片上传功能是web开发必不可少的功能.图片上传到哪里其实都是一个非常头疼的事情,多个文件源各种地址组合,经常会出现图片地址错误问题.自从前后端分离.小程序.app成为流行后,大家一般都会将文件 ...

  5. java利用iText写pdf并上传阿里云OSS并下载

    iText是用于生成pdf的一个类库,通过它可以生成pdf或者将XML , HTML转换城pdf模版:阿里云的oss对象存储存储的类型比较多了,可以存储音频 图片 pdf excel 等资源,oss本 ...

  6. base64格式的图片上传阿里云

    base64格式的图片上传阿里云 上传图片的时候,除了普通的图片上传,还有一张图片信息是以base64格式发送到后台的. 后台接受base64格式的图片,上传至阿里云代码:(主要是将base64转化成 ...

  7. 微信小程序将资源上传阿里云OSS

    我们在实际业务中经常能遇到将各种资源上传到云服务器,这样做第一是能更好的管理我们的比如图片资源,视频,音频资源等,同时也能节约公司的网络带宽,减少各种资源随着时间的推移资源越来越多造成服务器的硬盘压力 ...

  8. 微信小程序上传阿里云视频文件流程及代码

    为了微信小程序客服端实现自拍视频能够分享给多个好友,我们需要把小程序自拍的视频存储到服务器,而阿里云在性能和速度上比较不错,所以我们选择了阿里云作服务器. 第一步.微信小程序项目创建 1. 到http ...

  9. Vue上传阿里云OSS(STS方式)

    一.准备工作 1. 开通阿里云OSS服务,从控制台上获取AccessKeyId和AccessKeySecret. 2. 创建Bucket,并登录OSS控制台 3. 配置Bucket (很重要) 将al ...

最新文章

  1. python多线程爬虫实例-Python3多线程爬虫实例讲解代码
  2. AttachThreadInput
  3. 关于django—模型序列化器类详细内容
  4. DCMTK:DcmAttributeFilter类的测试程序
  5. DataGrid 功能实现收集(一)
  6. 2018移动端页面适配-自适应最新方案直接写px--------通过gulp工作流搭建一体化的移动端开发环境
  7. apache启动错误 AH00072: make_sock: could not bind to address [::]:443
  8. 文字加减前后缀lisp_LISP 图层前后缀_显示图层的Lisp程式
  9. 杭电多校HDU 6579 Operation (线性基 区间最大)题解
  10. 数据结构:邻接表法存储有向图
  11. 插头dp ——从入门到跳楼
  12. 牛头刨床设计matlab生成图片,牛头刨床matlab程序---机械原理课程设计
  13. 计算机网络未识别网络,电脑网络出现未识别的网络,无Internet访问的解决办法...
  14. Anomalies,Factors,andMultiFactorModels
  15. 计算机网络(3)--应用层协议--HTTP与HTTPS
  16. android 背景 投影,Android ImageView投影
  17. 详解爬虫模拟登陆的三种方法
  18. 自制F1C200S demo板(六、裸机寄存器点灯)
  19. java的 finalize() 方法
  20. Python爬虫爬取美女写真实例

热门文章

  1. [css] 使用rem时应该注意什么?
  2. 工作177:表单重置项目处理
  3. “约见”面试官系列之常见面试题之第一百零五篇之v-if与v-show(建议收藏)
  4. 前端学习(2033)vue之电商管理系统电商系统之通过路由加载报表
  5. 前端学习(1165):扩展运算符01
  6. java学习(160):interrupt方法
  7. CSS之background-origin属性
  8. python灰色模型代码_几行代码搞定ML模型,低代码机器学习Python库正式开源
  9. HTML 禁止数字因被自动识别为手机号,而被添加拨号链接样式
  10. TextView设置缩略显示