Повреждение при загрузке изображений с помощью API S3 SeaweedFS
Описание проблемы
Я столкнулся с проблемой, когда изображения, загруженные через Django (с использованием boto3) в S3 API SeaweedFS, повреждаются, в то время как загрузка через настольное приложение S3 Browser работает корректно. Загруженные файлы на 55 байт больше оригинальных и содержат заголовок Content-Encoding: aws-chunked
, что делает изображения неоткрываемыми.
Настройка среды
- Storage: SeaweedFS with S3 API
- Proxy: nginx (обработка SSL)
- Framework: 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==
Попытки решения
- Пробовали разные способы загрузки:
# Method 1: Using ContentFile storage.save(path, ContentFile(file_content)) # Method 2: Using Django File object storage.save(path, File(file)) # Method 3: Direct boto3 upload client.upload_fileobj(f, bucket_name, path)
Вопросы
- Является ли это известной проблемой в реализации S3 API SeaweedFS?
- Есть ли способ отключить кодировку
aws-chunked
в boto3? - Есть ли специальные заголовки или конфигурации, необходимые в прокси 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'})