我们先看一下微信上传素材的要求:
显然在js代码里我们用不了上面的代码,找了很多curl相关的库也没搞定。
下面是上传文件的最终解决方案:
如何上传文件
引入三个我们要使用的库
var request = require('request');//http请求库
var fs = require('node-fs');//文件操作库
var formstream = require('formstream');//http发送post请求构造表单数据的库
发送参数里要求form-data中媒体文件标识有,filename,filelength,content-type等信息
下面是关键的代码了
fs.stat(filePath, function (err, stat) {
var url = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}'.format(access_token, uploadType);//uploadType就是媒体文件的类型,image,voice等
var form = formstream();
form.file('media', filePath, fileName, stat.size);//将文档中媒体文件需要的filename,filelength参数加到要上传的表单,content-type不知道为啥没有,可能自带吧
var upload = request.post(url, {headers: form.headers()}, function (err, httpResponse, body) {
if (err) {
return console.error('上传失败:', err);
}
console.log('上传成功!服务器相应结果:', body);
});
form.pipe(upload);
});
至此我们就完成了媒体文件的上传。
保存网络文件到node服务器
那么从上面的方法来看,只能上传在服务器已经存在的文件,所以有些网络文件我们需要手动保存到服务器上,如何保存呢?这就用到了node-fs库了,代码如下:
var url = fileUrl;//文件的url地址,下面的代码中,我们用pipe管道的方式把url请求过来的数据写入到本地
//创建目录
fs.exists(path, function(exists){
if(exists){
request(url).pipe(fs.createWriteStream(path + '/' + filename));
} else {
fs.mkdir(path, function () {
request(url).pipe(fs.createWriteStream(path + '/' + filename));
});
}
});
OK,至此我们完成了保存网络文件的功能。
结合上面的上传功能,我们就完成了把网络素材上传到微信服务器的功能,这样我们可以再获取素材对公从号粉丝进行相关的内容推送。node可能还有别的上传素材到微信服务器的方法,但是从网上看没找到相关博客和文档。