You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django+boto3通过SeaweedFS S3 API上传图片时文件损坏问题求助

Django+boto3通过SeaweedFS S3 API上传图片时文件损坏问题求助

大家好,我最近碰到一个非常棘手的问题,想请教一下各位大佬:

问题描述

我用Django结合boto3通过SeaweedFS的S3 API上传图片时,上传后的文件总会损坏,但用S3 Browser桌面客户端上传完全正常。上传后的文件比原文件大了55字节,还带有Content-Encoding: aws-chunked的响应头,导致图片根本无法打开。

环境配置

  • 存储服务:开启S3兼容API的SeaweedFS
  • 代理:负责SSL处理的nginx
  • 开发框架:Django
  • 存储客户端:boto3
  • 上传方式:使用Django的PrivateStorage存储后端

问题细节

S3 Browser桌面客户端上传情况

  • 文件大小和原文件完全一致
  • 图片可以正常打开
  • 没有任何损坏问题

Django/boto3上传情况

  • 文件大小比原文件增加了55字节
  • 响应中包含Content-Encoding: aws-chunked头
  • 图片损坏,无法打开
  • 文件开头出现了意外的100000数据
  • 文件末尾以.x-amz-checksum-结尾

损坏文件示例

Original file size: 12345 bytes
Uploaded file size: 12400 bytes (+55 bytes)
First bytes: 100000...
Last bytes: ...x-amz-checksum-crc32:SJJ2UA==

已尝试的解决方法

我试了三种不同的上传方式,但结果都一样:

# 方法1:使用ContentFile
storage.save(path, ContentFile(file_content))

# 方法2:使用Django File对象
storage.save(path, File(file))

# 方法3:直接调用boto3上传
client.upload_fileobj(f, bucket_name, path)

我的疑问

  1. 这是不是SeaweedFS的S3 API实现的已知问题?
  2. 有没有办法在boto3中禁用aws-chunked编码?
  3. nginx代理需要配置特定的请求头或参数,才能正确处理二进制文件的上传吗?

额外信息

  • Django版本:5.1.7
  • boto3版本:1.37.23

我还单独写了一段测试代码来复现问题,结果还是一样:

import boto3

AWS_ACCESS_KEY_ID=''
AWS_SECRET_ACCESS_KEY=''
API_URL=''

bucket_name = 'sample-bucket'
s3 = boto3.client('s3',
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    endpoint_url=API_URL)

testfile = r"image.png"

s3.upload_file(testfile, bucket_name, 'sample.png', ExtraArgs={'ContentType': 'image/png'})

真心希望能得到各位的帮助,谢谢大家🙏!

备注:内容来源于stack exchange,提问作者Nguyễn Anh Bình

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:23:00