使用 nodeJs 开发微信公众号(上传图片)
在给用户发送消息中涉及到的素材(图片、视频、音频、文章等)需要事先传到微信服务器,然后获得媒体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
使用 nodeJs 开发微信公众号(上传图片)的更多相关文章
- NodeJs 开发微信公众号(五)真实环境部署
		在测试环境下开发完成代表着你离正式上线的目标不远了.接下来本章就主要谈一谈把测试环境的公众号升级为正式的公众号. 服务器和域名 目前为止我们只是在自己的电脑上完成了测试环境.真实的线上环境当然需要自己 ... 
- NodeJs 开发微信公众号(四)微信网页授权
		微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ... 
- NodeJs 开发微信公众号(二)测试环境部署
		由于卤煮本人是做前端开发的,所以在做公众号过程中基本上没有遇到前端问题,在这方面花的时间是最少的.加上用了mui框架(纯css界面)和自己积累的代码,很快地开发出了界面来.接着是后台开发.卤煮选的是n ... 
- NodeJs 开发微信公众号(一)准备工作
		前言 大概是一个月前,自己用业余时间做了一个微信公众号.微信开发,尤其是对后台不熟悉的人来说显得尤其困难.首先要克服的是后台语言(nodejs)的一些不熟悉困难,其次,也是最大的一点困难是在跟微信交互 ... 
- Nodejs开发微信公众号中控服务
		本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 本项目旨在为多个微信公众号 ... 
- NodeJs 开发微信公众号(三)微信事件交互
		微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ... 
- 使用 nodeJs 开发微信公众号(配置服务器)
		流程如下: 1. 申请微信公众号:企业号.服务号.订阅号(前两个要钱) 2. 配置微信公众号后台 选择基本配置,获得 AppId 和 AppSecret ,点击服务器配置 URL:你服务器地址,不能是 ... 
- 使用 nodeJs 开发微信公众号(获取access_token)
		要使用微信提供的功能接口,就需要获取到access_token,这是开发公众号必不可少的一部 access_token有效期20分钟,建议保存起来,过期后在重新获取 获取流程如下: 我将微信相关的操作 ... 
- 使用 nodeJs 开发微信公众号(设置自动回复消息)
		微信向第三方服务器发送请求时会降 signature .timestamp. nonce . openid(用户标识),发送内容会以 xml 的形式附加在请求中 回复消息前提我们得拿到用户id , 用 ... 
随机推荐
- 学习笔记CB011:lucene搜索引擎库、IKAnalyzer中文切词工具、检索服务、查询索引、导流、word2vec
			影视剧字幕聊天语料库特点,把影视剧说话内容一句一句以回车换行罗列三千多万条中国话,相邻第二句很可能是第一句最好回答.一个问句有很多种回答,可以根据相关程度以及历史聊天记录所有回答排序,找到最优,是一个 ... 
- 3.GUI Skin和自定义风格的组件 --《UNITY 3D 游戏开发》笔记
			自定义皮肤还是很受女孩子欢迎的吧,这样操作一下界面是不是就可以变得美美哒了~ 先pick一下测试代码: public class GUISkinScript : MonoBehaviour { //自 ... 
- log4j-over-slf4j和slf4j-log4j12冲突问题解决
			解决办法: 两个jar包会循环引用导致内存溢出.解决的办法就是将两个jar包其中一个的依赖移除掉 
- C# 控件消失等问题
			控件消失原因: 1.新控件的触发导致页面重载,该重载有没有达到原有控件的触发状态进而消失. 2.(目前只发现这一点,后续又发现再更...) 1.示例: ASPX: <div> <!- ... 
- 部署JupyterLab和pyalgotrade搭建web策略回测环境
			==========================================================================安装anaconda 3 64位版本cd /optm ... 
- zabbix3.4使用外部邮件报警
			打开web页面,找到 管理--报警媒介类型 打开 Email 填写外部邮箱信息 点击更新,这样发件人和邮箱服务器信息定义完成. 添加收件人信息: 接下来创建动作,配置---动作---选触发器 ok 过 ... 
- python爬虫---selenium库的用法
			python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ... 
- C# .NET MODEL 复制,实体类复制
			-- /// <summary> /// 将T1 实体的参数复制给 T2 ,不能处理多层次 /// </summary> /// <typeparam name=&quo ... 
- 批量删除ppt动画
			alt+F11打开宏编辑窗口,输入以下代码,运行即可: Sub removeALL() Dim I As Integer: Dim J As Integer Dim oActivePres As Ob ... 
- ARC085F NRE
			看了题解. 题目大意 你有一个长度为 \(N\) 的全为 \(0\) 的序列 \(A\),给你一个长度同样为 \(N\) 的 \(0/1\) 序列 \(B\),允许你对把 \(A\) 的一些区间中的数 ... 
