详解nodejs微信公众号开发——5.素材管理接口
本文详细讲解Node.js微信公众号开发中的素材管理接口实现。重点介绍如何调用API上传临时素材(图片、语音等)及永久素材(图文、图片等),包括获取MediaId、处理文件类型限制、HTTPS调用要求,以及获取和删除素材的方法。通过具体代码示例,帮助开发者掌握多媒体文件的上传与管理技巧。
素材管理接口概述
在上一篇文章《nodejs微信公众号开发——4.自动回复各种消息》中,我们实现了被动回复文字和图文消息。当时回复图片失败,原因是需要先通过素材管理接口上传多媒体文件,从而获取MediaId。本节我们将重点实现素材管理的接口。具体细节可参考公众平台开发者文档。
新增临时素材
1. 新增临时素材
所谓临时素材,顾名思义是指其具有时效性,上传后经过一定时间会被系统清理,适用于有时效性的图文链接。关于临时素材,有以下几个关键点需要注意:
- 对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(因此,若开发者需要保留粉丝发送的素材,应尽快下载到本地),以此来节省服务器资源。
- media_id是可以复用的。
- 素材的格式和大小要求与公众平台官网规定一致。具体而言,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式;语音大小不超过5M,时长不超过60秒,支持mp3/wma/wav/amr格式。
- 调用本接口需使用https协议。
请求地址:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
1.1 实现uploadTempMaterial方法
uploadTempMaterial用于上传临时素材,我们直接在Wechat的原型链上添加该方法:
Wechat.prototype.uploadTempMaterial = function(type,filepath){
var that = this;
var form = { //构造表单
media:fs.createReadStream(filepath)
}
return new Promise(function(resolve,reject){
that.fetchAccessToken().then(function(data){
var url = api.uploadMaterial + 'access_token=' + data.access_token + '&type=' + type;
request({url:url,method:'POST',formData:form,json:true}).then(function(response){
var _data = response.body;
if(_data){
resolve(_data)
}else{
throw new Error('upload material failed!');
}
}).catch(function(err){
reject(err);
});
});
});
}
代码中的fetchAccessToken用于获取access_token,修改回复数字2的代码逻辑如下:
else if(content === '2'){
var data = yield wechatApi.uploadTempMaterial('image',__dirname+'/public/king.jpg');
reply = {
type:'image',
mediaId:data.media_id
}
}
首先将本地的一张图片上传到临时素材接口,获取media_id,并将其封装到回复消息中。同样的方法也适用于语音、视频等其他类型:

新增永久素材
2. 新增永久素材
永久素材将永远存储在微信后台服务器上,不会失效。关于永久素材,有以下几个特点:
- 新增的永久素材也可以在公众平台官网的素材管理模块中查看。
- 永久素材的数量有上限,请谨慎新增。其中,图文消息素材和图片素材的上限为5000,其他类型素材的上限为1000。
- 素材的格式和大小要求与公众平台官网规定一致。具体而言,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式;语音大小不超过5M,时长不超过60秒,支持mp3/wma/wav/amr格式。
- 调用该接口需使用https协议。
新增永久图文素材请求地址:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
新增永久图片请求地址:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
新增其他类型永久素材请求地址:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN
2.1 实现uploadPermMaterial方法
uploadPermMaterial和uploadTempMaterial方法基本类似,只是永久素材的上传分为三类,需要判断传入的类型。
Wechat.prototype.uploadPermMaterial = function(type,material){
var that = this;
var form = {}
var uploadUrl = '';
if(type === 'pic') uploadUrl = api.uploadPermPics;
if(type === 'other') uploadUrl = api.uploadPermOther;
if(type === 'news'){
uploadUrl = api.uploadPermNews;
form = material
}else{
form.media = fs.createReadStream(material);
}
return new Promise(function(resolve,reject){
that.fetchAccessToken().then(function(data){
var url = uploadUrl + 'access_token=' + data.access_token;
var opts = {
method:'POST',
url:url,
json:true
}
(type == 'news') ? (opts.body = form) : (opts.formData = form); //上传数据的方式不同
request(opts).then(function(response){
var _data = response.body;
if(_data){
resolve(_data)
}else{
throw new Error('upload permanent material failed!');
}
}).catch(function(err){
reject(err);
});
});
});
}
注:虽然实现了永久素材上传,但测试账号并非每一次都能测试成功,且未经过认证的订阅号也不支持永久素材的上传。
获取与删除素材
3. 获取素材链接
由于获取临时素材和获取永久素材的差异性不大,我们直接将其放在一个函数中完成。
Wechat.prototype.getMaterial = function(mediaId,permanent){
var that = this;
var getUrl = permanent ? api.getPermMaterial : api.getTempMaterial;
return new Promise(function(resolve,reject){
that.fetchAccessToken().then(function(data){
var url = getUrl + 'access_token=' + data.access_token;
if(!permanent) url += '&media_id=' + mediaId;
resolve(url)
});
});
}
4. 删除永久素材
删除永久素材相对简单,只需传入一个mediaId即可:
Wechat.prototype.delMaterial = function(mediaId){
var that = this;
return new Promise(function(resolve,reject){
that.fetchAccessToken().then(function(data){
var url = api.delPermMaterial + 'access_token=' + data.access_token;
var form = {media_id:mediaId}
request({url:url,method:'POST',formData:form,json:true}).then(function(response){
var _data = response.body;
if(_data.errcode === '0'){
resolve();
}else{
throw new Error('delete permanent material failed!');
}
}).catch(function(err){
reject(err);
});
});
});
}
5.其他
还有修改永久图文素材、获取素材总数、获取素材列表功能,由于本项目中不会用到,这里就不一一实现了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
NestJS 是什么?与 Express、Koa 的核心区别及选型建议
2026-11-05 13:46:41
生产环境升级 Node.js 的注意事项与兼容性测试策略
2026-11-05 09:19:24
nvm 常用命令详解:怎么平滑切换和升级 Node.js 版本
2026-11-04 09:02:34
JavaScript和JSP的根本区别:运行环境与执行机制解析
2026-11-03 23:30:18
使用nvm卸载指定版本Node.js并切换默认环境
2026-11-03 23:09:26
