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

标签 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 字符串作为有效参数传递给表单? (现在尝试使用缓冲区但不工作)

最佳答案

我假设 http://localhost:8888/upload 期望 file 是……一个"file"。当您将文件流传递给 form.append() 时,它已经知道它是一个"file"。当传递 Buffer 时,它不会。

但是,您可以通过将选项对象作为第三个参数传递,告诉 form.append() 将您的 Buffer 解释为"file"。选项对象应该有一个名为 filename 的键,其中包含一个带有文件名的字符串。可选地,对象还可以包括 contentType 字符串和 knownLength 整数。如果未包含 contentTypeform.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/

相关文章:

javascript - 让 Discord Bot 接收文件并将内容发送到 channel

node.js - 通过 github 部署时,nodejitsu 中的快照版本没有变化

multipartform-data - 如何使用 Postman 发送多部分/表单数据请求

java - 使用 RestTemplate 时如何在分段上传中设置文件的内容类型(来自休息客户端)

javascript - React + Meteor 中的无限滚动

javascript - getmetadata 用于 Azure Blob 存储 NodeJ 中选择的 Blob

javascript - 如何使用定义文件创建 npm 包?

java - 使用 Relay Modern 和 GraphQL 上传文件

objective-c - 上传文件使用uploadTaskWithRequest :fromFile: in background and use multipart/form-data

javascript - 将 Blob 对象转换为文件,对于 Ms Edge