【问题标题】:How to extract/parse the binary content from a Multipart response in NodeJS?如何从 NodeJS 中的 Multipart 响应中提取/解析二进制内容?
【发布时间】:2020-01-18 06:02:36
【问题描述】:
我想从多部分响应中提取二进制内容,如下所示 -
我无权访问任何请求对象(Express/NodeJS)。我只有这个响应对象,我想解析并提取它的二进制部分。
编辑 -
为了让事情更清楚 -
我有一个端点(不是传统的 Express 应用,而是 FaaS) - 称为“/fileUpload”
此端点接受所有类型的请求 - GET、POST、PUT (FaaS)。
当我使用表单数据中的文件 - testImage.PNG 发出 POST/PUT 请求时,我会收到请求对象中的内容。 FaaS 运行时提供 req 对象作为函数处理程序的参数。
现在,当我打印传入 POST 请求的 request.body 时,我得到的内容如上图所示。
如果我尝试将此二进制内容直接上传到 S3,它会导致图像损坏,我认为这是由于多部分响应中存在其他内容,例如 - Content-Disposition...
我想做的是,解析额外的多部分内容,如 Content-Type 标头和多部分边界等,这样我就只能得到图像二进制文件。
【问题讨论】:
-
这看起来像是一个名为 testImage.PNG 的文件的文件上传。是否要将文件存储在服务器的文件系统中?把它放在一个数组中?要不然是啥?请edit您的问题澄清您的要求。
标签:
javascript
node.js
express
multipartform-data
multipart
【解决方案1】:
我为这个问题苦苦挣扎了很多天。解决方案是在 API GATE WAY > 配置 > 二进制类型添加multipart/form-data。
【解决方案2】:
要提取二进制内容,我们需要删除/解析它的标题和边界部分。有一个库 - parse-multipart 可以很容易地做到这一点。
示例 -
假设请求标头包含content-type 标头。
var multipart = require('parse-multipart');
// The following section is the express endpoint/ FaaS handler
{
let header = req.headers["content-type"]
let boundary = header.split(" ")[1]
boundary = header.split("=")[1]
let body = event.data;
//console.log("Boundary - "+ boundary)
let parts = multipart.Parse(body, boundary);
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
console.log(part)
var params = {
Bucket: s3bucket,
Key: part.file,
Body: part.data,
ACL: 'public-read',
Metadata: {
'Content-Type': part.type
}
};
//Upload the data to aws
const data = await s3.putObject(params).promise()
}
return parts
}