node.js - 如何将文件作为 FormData 从 S3 发布到另一个 API?

标签 node.js amazon-s3 axios multipartform-data

我有一个 node.js Lambda 函数,可以下载 .docx来自 S3 存储桶的文件。

const object = await s3.getObject({
    Bucket: bucket,
    Key: templateName,
}).promise();

return object.Body;

然后,我想获取此文件,并使用 axios 将其发布到另一个 API 以将其转换为 PDF(Gotenberg 实例)。

但是,我不断收到两个空白页作为转换结果,这表明它发送了一些数据,因为它是一个两页的 Word 文档。

我目前正在使用object.Body值(记录时是一个缓冲区: <Buffer 50 4b 03 04 14 [...] )。

然后,我尝试将其放入对 Gotenberg 的 POST 请求中:

const formData = new FormData();
formData.append('files', object.Body, { filename: 'suitability-purchase.docx' });

const response = await axios.post(`${documentConversionService}/convert/office`, formData, {
    headers: {
        ...formData.getHeaders()
    }
});

console.log('Conversion finished', response);
return response.data;

返回一个包含两个空白页的 PDF 文档。

我的问题是,如何正确发布 FormData对于内存中的文件数据?我只是错过了一些明显的东西吗?

我已经从 S3 手动下载了文档,并使用 Postman 将其发送到 Gotenberg API,效果很好。我不认为源文件有什么问题;这似乎就是我用代码发送文档的方式。

我尝试了使用表单数据进行 axios 调用的不同方法的几种变体,但无法使其不生成空白页面。

最佳答案

我的问题不好。

问题是 axios 需要被告知以流的形式返回数据。然后将结果转换为缓冲区即可解决问题:

const stb = require('@jorgeferrero/stream-to-buffer');

const response = await axios({
    url: `${documentConversionService}/convert/office`,
    method: 'post',
    headers: formData.getHeaders(),
    data: formData,
    responseType: 'stream',
});

return await stb.streamToBuffer(response.data);

关于node.js - 如何将文件作为 FormData 从 S3 发布到另一个 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58836211/

相关文章:

node.js - 需要 Express 应用程序中的子模块

javascript - rollupjs 和 sapper - 未定义要求

amazon-web-services - 我可以配置 S3 静态站点以根据确切的 key 进行重定向吗?

java - 如何在aws lambda java中仅从s3下载一次s3文件

javascript - 如何在响应 hasMore 标志为真时链接 axios 获取请求

node.js - 如何在 Node.js 中获取连接客户端的 IP 地址?

javascript - http get NodeJS如何获取错误状态码?

reactjs - 限制 S3 静态网站访问 Cloudfront

vue.js - Vue : 404 page not found after refresh page

javascript - Vue Js - 文件输入更改后发送 axios 请求