使用nodejs上传文件到s3

Kha*_*ham 3 javascript file-upload amazon-s3 node.js aws-sdk

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

当我替换Body时,Body: "test"该函数将成功执行,我可以test看到s3.

但是我想上传一个文档,例如pdf文件,它无法运行并抛出错误:

UnhandledPromiseRejectionWarning:类型错误 [ERR_INVALID_ARG_TYPE]:“path”参数必须是字符串、缓冲区或 URL 类型之一。在新的 ReadStream (internal/fs/streams.js:99:10) 处的 ReadStream.open (internal/fs/streams.js:110:12) 处的 Object.open (fs.js:406:3) 处接收到类型对象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}`) })
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Gib*_*bor 6

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

相反,使用该fs.readFileSync函数将文件读入缓冲区(如果使用异步,fs.readFile您将得到一个承诺 - 它既不是字符串、缓冲区也不是 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'
  };
Run Code Online (Sandbox Code Playgroud)

有关功能的更多信息fs可以在文档中找到 -这里

  • @KhanhPham 对你有帮助吗?如果是这样,请接受答案,或者如果您遇到其他问题,请详细说明:) (2认同)