【问题标题】:Image file cut off when uploading to AWS S3 bucket via Django and Boto3通过 Django 和 Boto3 上传到 AWS S3 存储桶时图像文件被切断
【发布时间】:2016-12-05 08:05:56
【问题描述】:

当我将较大的图像 (3+ MB) 上传到 AWS S3 存储桶时,只有部分图像被保存到存储桶中(大约图像的前 10%,其余显示为灰色空间)。这些图像始终显示 256 KB 大小。较小的文件没有任何问题。

这是我的代码:

s3 = boto3.resource('s3') s3.Bucket(settings.AWS_MEDIA_BUCKET_NAME).put_object(Key=fname, Body=data)

...其中 data 是图像文件的二进制数据。

文件较小时没有问题,在 S3 存储桶中较大的文件都显示为 256 KB。

我找不到任何文档说明为什么会发生这种情况。有人可以指出我缺少什么吗?

谢谢!

【问题讨论】:

  • 您可能应该使用multipart-uploads,如示例here中所述
  • 对此进行了调查,但没有任何记录让我认为 3 MB 的数据应该需要分段上传。
  • 如何上传到 S3?它是使用应用程序服务器作为传递,还是在发送到 S3 之前将文件保存为临时文件?如果是后者,您能否确认您可以将文件完全上传到您的应用服务器的存储中?
  • 感谢您的帮助杰森。我一直在测试将图像上传到本地机器上的 django 开发服务器,我遇到了同样的问题,这让我相信这不是 boto/s3 问题。上传的数据是base64编码的图片文件。我注意到 len(b64_encoded_data) 和 len(b64_decoded_data) 存在巨大差异,其中解码的数据要小得多(小得多 75% 以上)。不确定是什么原因造成的,或者这是否是根本问题。任何想法表示赞赏。
  • 我建议您在浏览器控制台中记录 base64 编码/解码,并使用 Python 的 base64 库测试编码/解码服务器端。如果您可以打印出所有四个版本的数据并进行比较。如果服务器接收到的数据段小于浏览器推送的数据段,则客户端-服务器传输可能存在问题。

标签: django amazon-s3 boto boto3


【解决方案1】:

我遇到了同样的问题,我花了几个小时才弄明白。我终于通过创建一个流来修复它。这是我的代码:

const uploadFile = (filePath) => {
  let fileName = filePath;
  fs.readFile(fileName, (err, data) => {

  let body= fs.createReadStream(filePath);

   if (err) throw err;
   const params = {
      Bucket: 'bucketname', // pass your bucket name
      Key: fileName; 
      Body: body,
      ContentType: 'image/jpeg',
      ContentEncoding: 'base64',
   };
   s3.upload(params, function(s3Err, data) {
       if (s3Err) throw s3Err;
       console.log(`File uploaded successfully at ${data.Location}`);
       });
    });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2018-04-25
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多