【问题标题】:upload file to s3 using nodejs使用nodejs将文件上传到s3
【发布时间】:2019-12-13 16:59:56
【问题描述】:

我编写了一个使用aws-sdk 将文件上传到s3 的函数,但我遇到了问题。

当我将Body 替换为Body: "test" 时,函数将成功执行,我可以在s3 中看到test 的内容。

但我想上传pdf文件之类的文件,无法运行,报错为:

UnhandledPromiseRejectionWarning:TypeError [ERR_INVALID_ARG_TYPE]: “路径”参数必须是字符串、缓冲区或 URL 类型之一。 在 ReadStream.open 的 Object.open (fs.js:406:3) 接收到类型对象 (internal/fs/streams.js:110:12) 在新的 ReadStream (internal/fs/streams.js:99:10) 在 Object.createReadStream (fs.js:1725:10)

这是我的代码:

import { createWriteStream, createReadStream } from "fs";
import AWS from 'aws-sdk';
const fs = require('fs');


const uploadS3 = async ({file}) => {
  const { stream, filename} = file;
  AWS.config.update({
    accessKeyId: '*******',
    secretAccessKey: '********',
    region: 'us-east-1' 
  });

  let params = {
    Bucket: "test-files-staging",
    Key: 'documents/' + filename,
    Body: fs.createReadStream(file),
    ACL: 'public-read'
  };
  await new AWS.S3().putObject(params).promise().then(() => {
    console.log('Success!!!')
  }).catch((err) => { console.log(`Error: ${err}`) })
}

提前致谢。

【问题讨论】:

    标签: javascript node.js amazon-s3 file-upload aws-sdk


    【解决方案1】:

    嗯,错误很明显:path 参数需要是字符串、缓冲区或 URL,但您传入的是由 fs.createReadStream 创建的 readStream 对象。

    相反,使用fs.readFileSync 函数将您的文件读入缓冲区(如果您使用异步fs.readFile,您将得到一个promise——它既不是字符串、缓冲区也不是URL,并且会再次失败):

    let params = {
        Bucket: "test-files-staging",
        Key: 'documents/' + filename,
        Body: fs.readFileSync(filename), // assuming filename is the full path to your object
        ACL: 'public-read'
      };
    

    更多关于fs函数的信息可以在文档中找到-here

    【讨论】:

    • 我已更改为您的答案,但出现错误:UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open 'documet_1.pdf'
    • 观看我的评论,filename 必须是您尝试加载的文件的完整路径
    • @KhanhPham 对您有帮助吗?如果是这样,请接受答案,或者如果您遇到其他问题,请详细说明:)
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 2021-11-28
    • 2017-09-25
    • 2020-04-28
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多