Javascript AWS S3文件与Node.js一起上载:不支持的正文负载错误
我正试图让我的node.js后端上传一个文件到AWS S3,它是在我前端的post请求中得到的。这就是我的函数的外观:Javascript AWS S3文件与Node.js一起上载:不支持的正文负载错误,javascript,node.js,amazon-web-services,amazon-s3,backend,Javascript,Node.js,Amazon Web Services,Amazon S3,Backend,我正试图让我的node.js后端上传一个文件到AWS S3,它是在我前端的post请求中得到的。这就是我的函数的外观: async function uploadFile(file){ var uploadParams = {Bucket: '<bucket-name>', Key: file.name, Body: file}; s3.upload (uploadParams, function (err, data) { if (err) { co
async function uploadFile(file){
var uploadParams = {Bucket: '<bucket-name>', Key: file.name, Body: file};
s3.upload (uploadParams, function (err, data) {
if (err) {
console.log("Error", err);
} if (data) {
console.log("Upload Success", data.Location);
}
});
}
文件上载服务的postFile(fileToUpload:File)
方法用于发出post请求:
postFile(fileToUpload: File): Observable<Boolean> {
console.log(fileToUpload.name);
const endpoint = '/api/fileupload/single';
const formData: FormData = new FormData();
formData.append('fileKey', fileToUpload, fileToUpload.name);
return this.httpClient
.post(endpoint, formData/*, { headers: yourHeadersConfig }*/)
.pipe(
map(() => { return true; }),
catchError((e) => this.handleError(e)),
);
}
非常感谢您帮助解决此问题
最好的问候,塞缪尔,最好的方法是流式传输文件。假设你是。从磁盘读取它。你可以这样做
const fs = require("fs");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const stream = fs.createReadStream("file.pdf");
const Key = stream.path;
const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
console.log(response);
最好的方法是流式处理文件。假设你是。从磁盘读取它。你可以这样做
const fs = require("fs");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const stream = fs.createReadStream("file.pdf");
const Key = stream.path;
const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
console.log(response);
正文必须是缓冲区、类型化数组、Blob、字符串或ReadableStream。它是什么类型?@jarmod当我使用
typeof
记录数据类型时,我得到了日志:object
。如果有必要的话,我最初上传的文件是.pdf。我尝试使用:Buffer.from(JSON.stringify(file),'utf-8')
将文件转换为类型Buffer,但这对我不起作用。谢谢你的帮助!如何创建文件
对象?你能添加代码吗?@jarmod谢谢你的快速回复。我编辑了我的问题并加入了代码。顺致敬意,您已经显示了客户端代码,但关键是服务器端代码。接收已发布文件并将每个文件提供给“上载到S3”函数的代码。你在服务器端做什么来接受上传的文件?例如,您可以使用中间件将其持久化到磁盘,也可以使用Express以特定格式将文件内容传递给您。正文需要是缓冲区、类型化数组、Blob、字符串或ReadableStream。它是什么类型?@jarmod当我使用typeof
记录数据类型时,我得到了日志:object
。如果有必要的话,我最初上传的文件是.pdf。我尝试使用:Buffer.from(JSON.stringify(file),'utf-8')
将文件转换为类型Buffer,但这对我不起作用。谢谢你的帮助!如何创建文件
对象?你能添加代码吗?@jarmod谢谢你的快速回复。我编辑了我的问题并加入了代码。顺致敬意,您已经显示了客户端代码,但关键是服务器端代码。接收已发布文件并将每个文件提供给“上载到S3”函数的代码。你在服务器端做什么来接受上传的文件?例如,您可以使用中间件将其持久化到磁盘,或者您可以使用Express以特定格式将文件内容传递给您。我不是从磁盘读取文件。我正在开发一个web应用程序,用户在angular前端上传他们的文件,然后将文件发布到后端,后端应该会上传这些文件。能否在前端创建一个流并将其传递到后端?我没有从磁盘读取文件。我正在开发一个web应用程序,用户在angular前端上传他们的文件,然后将文件发布到后端,后端应该会上传这些文件。是否可以在前端创建流并将其传递到后端?
app.post('/api/fileupload/single', async (req, res) => {
try {
if(!req.files) {
res.send({
status: false,
message: 'No file uploaded'
});
} else {
let file = req.files.fileKey;
uploadFile(file);
//send response
res.send({
status: true,
message: 'File is uploaded',
data: {
name: file.name,
mimetype: file.mimetype,
size: file.size
}
});
}
} catch (err) {
res.status(500).send(err);
}
});
const fs = require("fs");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const stream = fs.createReadStream("file.pdf");
const Key = stream.path;
const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
console.log(response);