使用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)
我的疑问
- 这是不是SeaweedFS的S3 API实现的已知问题?
- 有没有办法在boto3中禁用
aws-chunked编码? - 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
相关产品推荐
相关产品推荐

