在给用户发送消息中涉及到的素材(图片、视频、音频、文章等)需要事先传到微信服务器,然后获得媒体id(media_id),然后把 media_id 传递给用户

上传分上传临时素材(只保存三天)和上传永久素材

上传永久素材只有在认证完成后才有权限

上传素材的提前条件就是获取 access_token,获取方法参考: https://www.cnblogs.com/xiaoliwang/p/10196102.html

这里采用上传的流程为:管理员上传图片到第三方服务器 -> 服务器保存资源获取本地存储路径 -> 将资源上传到微信服务器获取 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

最新文章

  1. ubuntu下怎么给普通用户赋予sudo权限
  2. HTTP状态301、404、200、304分别表示什么意思
  3. linux服务器报No space left on device错误的解决过程记录
  4. bzoj 1034 [ZJOI2008]泡泡堂BNB(贪心)
  5. javascript数组操作汇总
  6. android 签名被篡改(Keystore was tampered with, or password was incorrect)
  7. 要不要用STL的问题——真理是越辩越明的~
  8. 2429: [HAOI2006]聪明的猴子
  9. Centos中hive/hbase/hadoop/mysql实际操作及问题总结
  10. git操作+一个本地项目推到github上+注意
  11. params.success && params.success(res.data)
  12. mysql查询表结果排序
  13. 解决FAT32格式U盘安装win10时0x8007000D错误
  14. 笔记:MYSQL四种事务隔离级。
  15. Excel中concatenate函数的使用方法
  16. MySQL数据备份之mysqldump使用(转)
  17. Flex 数组问题!
  18. android 设置系统屏幕亮度
  19. HttpClient上传下载文件
  20. tensorflow基础篇-2

热门文章

  1. IDEA中的version control问题
  2. Go - WaitGroup
  3. sql server 与 sql server compact 互相数据导入
  4. R实用小技巧
  5. PRESTO安装部署和参数说明(一)
  6. mysql error 1067 invalid default timestamp
  7. zookeeper启动报错处理记录
  8. Winform 界面执行耗时操作--UI卡顿假死问题
  9. ECMA6 New Features
  10. Browser Page Parsing Details