我目前正在接收一个编码为 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 字符串作为有效参数传递给表单? (现在尝试使用缓冲区但不工作)
最佳答案
我假设 http://localhost:8888/upload
期望 file
是……一个"file"。当您将文件流传递给 form.append()
时,它已经知道它是一个"file"。当传递 Buffer
时,它不会。
但是,您可以通过将选项对象作为第三个参数传递,告诉 form.append()
将您的 Buffer
解释为"file"。选项对象应该有一个名为 filename
的键,其中包含一个带有文件名的字符串。可选地,对象还可以包括 contentType
字符串和 knownLength
整数。如果未包含 contentType
,form.append()
将尝试从 filename
派生内容类型。
除了确定 contentType
(当它没有在选项参数中显式传递时),您指定的 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' });
}
关于node.js - Nodejs 将 base64 字符串作为表单数据发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25511347/