新手请教一个base64编码上传的问题,请各位大侠帮忙指点一下,多谢。
背景:
提供上传接口给终端的JS调用,因为JS没办法直接上传,所以是把文件转成base64编码传给我,我再调文件服务器上传
问题:
我现在是拿到base64的字符串以后转成buffer保存到本地临时文件,再读取文件上传
因为我没办法把base64的编码直接转成readStream…
这个方法感觉很挫…请教有什么好办法没?
以下是我的代码:
app.post('/uploadBase64', function(req, res) {
var base64Data = req.body.base64Data;
var fileName = req.body.fileName;
var tempFilePath = path.join(__dirname, fileName);
// 用request上传文件
var r = request.post('http://文件服务器', function(error, response, body) {
// 上传完以后删除临时文件
fs.unlink(tempFilePath);
res.send({
media_id: JSON.parse(body).media_id
});
});
// base64保存为临时文件
fs.writeFileSync(tempFilePath, new Buffer(base64Data, 'base64'));
var form = r.form();
form.append('media', fs.createReadStream(tempFilePath));
});
2 回复
终于搞定了…
buffer转stream用上面仁兄给的方法或者下面这个都行
http://stackoverflow.com/questions/13230487/converting-a-buffer-into-a-readablestream-in-nodejs
可是我试了很多次都有问题,传到后台以后变成字符串了
后来跟了一下代码,发现是form-data这个中间件影响的
下面这个是form-data的源码,可以看到他是根据path来判断的,因为我们自己转的stream没有path,所以就按照普通字符串处理了…
FormData.prototype._multiPartHeader = function(field, value) {
var boundary = this.getBoundary();
var header =
'--' + boundary + FormData.LINE_BREAK +
'Content-Disposition: form-data; name="' + field + '"';
// fs- and request- streams have path property
// TODO: Use request's response mime-type
if (value.path) {
header +=
'; filename="' + path.basename(value.path) + '"' + FormData.LINE_BREAK +
'Content-Type: ' + mime.lookup(value.path);
// http response has not
} else if (value.readable && value.hasOwnProperty('httpVersion')) {
header +=
'; filename="' + path.basename(value.client._httpMessage.path) + '"' + FormData.LINE_BREAK +
'Content-Type: ' + value.headers['content-type'];
}
header += FormData.LINE_BREAK + FormData.LINE_BREAK;
return header;
};