在給用戶發送消息中涉及到的素材(圖片、視頻、音頻、文章等)須要事先傳到微信服務器,而後得到媒體id(media_id),而後把 media_id 傳遞給用戶html
上傳分上傳臨時素材(只保存三天)和上傳永久素材數據庫
上傳永久素材只有在認證完成後纔有權限express
上傳素材的提早條件就是獲取 access_token,獲取方法參考: https://www.cnblogs.com/xiaoliwang/p/10196102.htmlapi
這裏採用上傳的流程爲:管理員上傳圖片到第三方服務器 -> 服務器保存資源獲取本地存儲路徑 -> 將資源上傳到微信服務器獲取 media_id -> 將本地路徑和media_id 一齊存儲在數據表中服務器
這裏採用multer實現上傳微信
var express = require('express') var path = require('path') var router = express.Router() var multer = require('multer') //uuid工具能夠生成惟一標示 須要安裝 var UUID = require('uuid') var request = require('request') var fs = require('fs') const MediaModel = require('../model/media') //臨時路徑 var baseApi = `https://api.weixin.qq.com/cgi-bin/media/upload` //永久路徑 // var baseApi = `https://api.weixin.qq.com/cgi-bin/material/add_material` //設置保存規則 var storage = multer.diskStorage({ //destination:字段設置上傳路徑,能夠爲函數 destination: path.resolve(__dirname, '../upload'), //filename:設置文件保存的文件名 filename: function(req, file, cb) { let extName = file.originalname.slice(file.originalname.lastIndexOf('.')) let fileName = UUID.v1() cb(null, fileName + extName) } }) //設置過濾規則(可選) var imageFilter = function(req, file, cb){ var acceptableMime = ['image/jpeg', 'image/png', 'image/jpg', 'image/gif'] //微信公衆號只接收上述四種類型的圖片 if(acceptableMime.indexOf(file.mimetype) !== -1){ cb(null, true) }else{ cb(null, false) } } //設置限制(可選) var imageLimit = { fieldSize: '2MB' } //建立 multer 實例 var imageUploader = multer({ storage: storage, fileFilter: imageFilter, limits: imageLimit }).array('photos', 12) //定義表單字段、數量限制 var videoFilter = function(req, file, cb){ var acceptableMime = ['video/mp4'] //微信公衆號只接收上述四種類型的圖片 if(acceptableMime.indexOf(file.mimetype) !== -1){ cb(null, true) }else{ cb(null, false) } } var videoUploader = multer({ storage: storage, fileFilter: videoFilter, limits: { fieldSize: '10MB' } }).array('video', 10) router.post('/image', imageUploader, function(req, res, next) { var api = `${baseApi}?access_token=${global.accessToken}&type=image` req.files.forEach(file => { var formData = { media: fs.createReadStream(file.path) } request.post({url: api, formData: formData}, function(err,response,body){ if(err) { console.log('上傳圖片失敗' , err); return } let data = { media_id: JSON.parse(response.body).media_id, local_url: path.join(path.resolve(__dirname, '../upload'), file.filename), type: 'image' }
//保存數據庫 MediaModel.create(data).then(res => { console.log(`保存圖片${res.dataValues.media_id}成功`); }) }) }) }) router.post('/video', videoUploader, function(req, res, next) { console.log(req.files); }) module.exports = router