使用 nodeJs 開發微信公衆號(上傳圖片)

 在給用戶發送消息中涉及到的素材(圖片、視頻、音頻、文章等)須要事先傳到微信服務器,而後得到媒體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
相關文章
相關標籤/搜索