【问题标题】:nodejs file object send to aws s3 with s3.upload or s3.uploadPartnodejs 文件对象使用 s3.upload 或 s3.uploadPart 发送到 aws s3
【发布时间】:2020-03-09 07:04:11
【问题描述】:

我想将我从客户端获取的文件作为 multipart/form-data 发送到亚马逊 S3。

在 s3.upload 的原始文档中,它期望正文如下所示。

对于流,我需要将文件存储到文件系统中并给出路径。

问题来了。 我有我从客户端获取的文件对象作为 multipart/form-data

destination:"uploads"
encoding:"7bit"
fieldname:"file"
filename:"test.zip"
mimetype:"application/zip"
originalname:"test.zip"
path:"uploads\test.zip"
size:4440

有没有什么方法可以不存储文件系统直接发送文件?

【问题讨论】:

    标签: amazon-s3 upload aws-sdk multipartform-data nodejs-stream


    【解决方案1】:

    您没有提到您在 nodejs 端使用的表单数据方法。 如果您使用的是表单数据 npm 模块,那么您可以直接使用 form.getBuffer() 将文件数据转换为缓冲区@

    结帐更多参考here

    如果您使用请求模块下载文件,请执行以下操作:

    使用 request-promise npm 模块。

    let rp = require('request-promise');
    const fileUrl = 'http://sample.com/file';
    const downloadedFile  = await rp(fileUrl);
    const fileStreamData = Buffer.from(downloadedFile, 'utf-8');
    // Use fileStreamData in S3 upload as Body parameter.
    

    【讨论】:

    • 实际上我没有使用表单数据,我从请求中获取文件并使用 multer 保存到文件系统。之后给出缓冲区的路径并发送 s3。你是说我可以使用缓冲的表单数据库吗?
    • 修改了基于请求的方法的答案。
    • 我使用 multer 来获取多部分文件并将存储配置为默认值,如下所示。 var storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, 'uploads'); }, filename: (req, file, cb) => { cb(null, file.originalname); }, }); var upload = multer({ storage: storage }); 但我意识到,当您这样做时,它不会给您原始文件。所以我删除了存储配置并获得了原始文件,之后我能够访问文件缓冲区而不是发送var fileStreamData = Buffer.from(file.buffer, 'utf-8');,谢谢顺便说一句:)
    【解决方案2】:

    如果你使用 clean express - 你需要从用户那里读取文件输入 - 你可以使用一些中间件来为你做这件事。 然后您将获得二进制文件Buffer,您可以像在为 S3.upload 提供的示例代码中一样直接发送它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多