javascript - 使用nodejs将文件上传到s3

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

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

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

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

UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be one of type string, Buffer, or URL. Received type object at Object.open (fs.js:406:3) at ReadStream.open (internal/fs/streams.js:110:12) at new ReadStream (internal/fs/streams.js:99:10) at 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}`) })
}

提前致谢。

最佳答案

嗯,错误很明显: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

关于javascript - 使用nodejs将文件上传到s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57370978/

相关文章:

Javascript - 检查 Array forEach 中是否满足条件

javascript - Onkeypress 函数返回空格而不是字母

ruby-on-rails - Autoprefixer 不支持 Node v4.8.2。更新它

javascript - 未知运营商 : $and in MongoDB

node.js - Mongoose 更新查询不适用于 Node.js

javascript - 自定义 Angular Directive(指令)中的 ng-repeat 不起作用

javascript - 添加 EmojiOne 区域后字符计数器中断

amazon-web-services - 如何为我的 AWS S3 存储桶分配子域?

ruby-on-rails - Rails4.1 : AWS errors missing region

amazon-web-services - Amazon EC2 到 S3 传输