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

时间:2014-08-26 17:03:00

标签: node.js multipartform-data

我目前正在接收一个编码为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字符串作为有效参数传递给表单? (现在尝试使用缓冲区而不工作)

1 个答案:

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