我目前正在接收一个编码为base64字符串的文件作为json有效负载的一部分:
{
"file":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGRlZmluaXRpb25zIHhtb..."
}
使用该字符串我应该将文件作为multipart / form-data发布到不同的服务,所以我有一个这样的方法(使用request module):
var request = require('request');
var fs = require('fs');
var importFile = function(fileBase64Encoded, cb) {
var decodedFile = new Buffer(fileBase64Encoded, 'base64');
var r = request.post('http://localhost:8888/upload', function (err, httpResponse, body) {
if (err) {
cb(err);
}
cb(null, body);
});
var form = r.form();
form.append('file', decodedFile);
}
这目前无效。 如果我将文件写入磁盘并从那里读取它:
var request = require('request');
var fs = require('fs');
var importFile function(fileBase64Encoded, cb) {
var decodedFile = new Buffer(fileBase64Encoded, 'base64');
fs.writeFile('temp.txt', decodedFile, function (err) {
if (err) return console.log(err);
var r = request.post('http://localhost:8888/upload', function (err, httpResponse, body) {
if (err) {
cb(err);
}
cb(null, body);
})
var form = r.form();
form.append('file', fs.createReadStream('temp.txt'));
});
}
然后它工作...所以有没有一种方法将base64字符串作为有效参数传递给表单? (现在尝试使用缓冲区而不工作)
答案 0 :(得分:8)
我认为http://localhost:8888/upload
期待file
是..."文件"。当您将文件流传递给form.append()
时,它已经知道它是一个"文件"。传递Buffer
时没有。
但是,您可以告诉form.append()
将您的Buffer
解释为"文件"通过传递选项对象作为第三个参数。 options对象应该有一个名为filename
的键,其中包含一个带有文件名的字符串。可选地,该对象还可以包括contentType
字符串和knownLength
整数。如果未包含contentType
,则form.append()
会尝试从filename
中获取内容类型。
除了确定contentType
(当它没有在options参数中显式传递)时,你指定的filename
是无关紧要的(即你可以使用你想要的任何文件名)。当然,除非您打算在服务器端代码上使用filename
。
在您的情况下,以下情况应该有效。
var importFile = function(fileBase64Encoded, cb) {
var decodedFile = new Buffer(fileBase64Encoded, 'base64');
var r = request.post('http://localhost:8888/upload', function (err, httpResponse, body) {
if (err) {
cb(err);
}
cb(null, body);
});
var form = r.form();
form.append('file', decodedFile, { filename: 'temp.txt' });
}