Nodejs将base64字符串作为表单数据发布

jdr*_*drm 2 multipartform-data node.js

我目前正在接收一个编码为base64字符串的文件作为json有效负载的一部分:

{
    "file":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGRlZmluaXRpb25zIHhtb..."
}
Run Code Online (Sandbox Code Playgroud)

使用该字符串我应该将文件作为multipart/form-data发布到不同的服务,所以我有一个像这样的方法(使用请求模块):

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);
}
Run Code Online (Sandbox Code Playgroud)

这目前无效.如果我将文件写入磁盘并从那里读取它,如下所示:

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'));
    });

}
Run Code Online (Sandbox Code Playgroud)

然后它工作...所以有没有一种方法将base64字符串作为有效参数传递给表单?(现在尝试使用缓冲区而不工作)

JME*_*JME 8

我认为这http://localhost:8888/uploadfile一个"文件".将文件流传递给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' });
}
Run Code Online (Sandbox Code Playgroud)