[英]upload file to s3 using nodejs
我编写了一个使用aws-sdk
将文件上传到 s3 的函数,但我遇到了问题。
当我用Body
Body: "test"
替换Body
,该函数将成功执行,我可以在s3
看到内容test
。
但是我想上传一个文档,比如pdf文件,它无法运行并抛出一个错误:
UnhandledPromiseRejectionWarning:TypeError [ERR_INVALID_ARG_TYPE]:“path”参数必须是字符串、缓冲区或 URL 类型之一。 在 Object.open (fs.js:406:3) at ReadStream.open (internal/fs/streams.js:110:12) at new 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}`) })
}
提前致谢。
嗯,错误很明显: path
参数需要是字符串、缓冲区或 URL,但是你传入一个对象,它是由 fs.createReadStream 创建的 readStream。
相反,使用fs.readFileSync
函数将您的文件读入缓冲区(如果您使用 async fs.readFile
您将得到一个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'
};
关于fs
函数的更多信息可以在文档中找到 - 这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.