微信 开发 图片 上传 阿里云 oss 服务器
生活随笔
收集整理的這篇文章主要介紹了
微信 开发 图片 上传 阿里云 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 服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习jvm,关于MAT an inter
- 下一篇: docker安装postgres