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

Node.js Nodejs将base64字符串作为表单数据发布,node.js,multipartform-data,Node.js,Multipartform Data,我当前收到一个编码为base64字符串的文件,作为json有效负载的一部分: { "file":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGRlZmluaXRpb25zIHhtb..." } 使用该字符串,我应该将文件作为多部分/表单数据发布到不同的服务,因此我有一个类似这样的方法(使用): 而这目前不起作用。 如果我将文件写入磁盘并从磁盘读取,如下所示: var request = require('request')

我当前收到一个编码为base64字符串的文件,作为json有效负载的一部分:

{
    "file":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGRlZmluaXRpb25zIHhtb..."
}
使用该字符串,我应该将文件作为多部分/表单数据发布到不同的服务,因此我有一个类似这样的方法(使用):

而这目前不起作用。 如果我将文件写入磁盘并从磁盘读取,如下所示:

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
希望
文件
为。。。“文件”。当您将文件流传递给
form.append()
时,它已经知道它是一个“文件”。当传递
缓冲区时
不会

但是,您可以告诉
form.append()
,通过将选项对象作为第三个参数传递,将
缓冲区解释为“文件”。选项对象应该有一个名为
filename
的键,其中包含一个带有文件名的字符串。或者,对象还可以包括
contentType
字符串和
knownLength
整数。如果未包括
contentType
form.append()
将尝试从
文件名中派生内容类型

除了确定
contentType
(在选项参数中未显式传递时),您指定的
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' });
}

调用request.post()时,是否已触发post请求?附加后如何发射?@Sisir
request.post()
在事件循环的下一个周期中自动激发。对
r
(请求对象)的任何更改都可以在触发下一个循环之前完成。
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' });
}