繁体   English   中英

尝试上传到 Amazon S3 时出现“不受支持的正文有效负载对象”

[英]"Unsupported body payload object" when trying to upload to Amazon S3

我想将文件从我的前端上传到我的 Amazon S3 (AWS)。

我正在使用 dropzone,所以我转换了我的文件并将其发送到我的后端。

在我的后端我的文件是这样的:

{ fieldname: 'file',
originalname: 'test.torrent',
encoding: '7bit',
mimetype: 'application/octet-stream',
buffer: { type: 'Buffer', data: [Array] },
size: 7449 },

当我尝试使用我的函数上传文件时:

var file = data.patientfile.file.buffer;

        var params = { Bucket: myBucket, Key: data.patientfile.file.fieldname, Body: file };

        s3.upload(params, function (err, data) {
            if (err) {
                console.log("******************",err)
            } else {
                console.log("Successfully uploaded data to myBucket/myKey");
            }
        });

我得到错误:

不受支持的正文有效负载对象

你知道如何发送我的文件吗?

我试图用putobject发送它并得到类似的错误。

我认为您可能需要将文件内容(在这种情况下可能是 data.patientfile.file.buffer)转换为二进制

var base64data = new Buffer(data, 'binary');

所以参数会是这样的:

var params = { Bucket: myBucket, Key: data.patientfile.file.fieldname, Body: base64data };

或者,如果我弄错了并且缓冲区已经是二进制的,那么您可以尝试:

var params = { Bucket: myBucket, Key: data.patientfile.file.fieldname, Body: data.patientfile.file.buffer};

这是我正在运行的生产代码。

请注意该问题可能发生在data1111

但是,要获得完整的想法,请在下面添加工作代码的所有关键部分。

客户:

// html

<input
  type="file"
  onChange={this.onFileChange}
  multiple
/>


// javascript

onFileChange = event => {
    const files = event.target.files;
    var file = files[0];
    var reader = new FileReader();
    reader.onloadend = function(e) {

        // save this data1111 and send to server
        let data1111 = e.target.result // reader.result // ----------------- data1111

    };
    reader.readAsBinaryString(file);
}

服务器:

// node.js/ javascript

const response = await s3
  .upload({
    Bucket: s3Bucket, // bucket
    Key: s3Path, // folder/file
    // receiving at the server - data1111 - via request body (or other)
    Body: Buffer.from(req.body.data1111, "binary") // ----------------- data1111
  })
  .promise();
return response;

为了使上述代码工作,整整花了 2 天时间。

希望这对将来的人有所帮助。

用 nodejs 实现了 Glen k 的回答......对我有用

   const AWS = require('aws-sdk');

   const s3 = new AWS.S3({
    accessKeyId: process.env.AWSAccessKeyID,
    secretAccessKey: process.env.AWSSecretAccessKey,
});
     
let base64data = Buffer.from(file.productImg.data, 'binary')

const params = {
  Bucket: BUCKET_NAME,
  Key: KEY, 
  Body: base64data
   }

  s3.upload(params, function(err, data) {
if (err) {
  console.log(err)
    throw err;
}
console.log(data)
console.log(`File uploaded successfully. ${data.Location}`);
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM