Повреждение при загрузке изображений с помощью 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

Подробности выпуска

  1. При загрузке через настольное приложение S3 Browser:

    • Размер файла соответствует оригиналу
    • Изображение открывается корректно
    • Нет проблем с повреждением
  2. При загрузке через 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. Пробовали разные способы загрузки:
    # 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)
    

Вопросы

  1. Является ли это известной проблемой в реализации S3 API SeaweedFS?
  2. Есть ли способ отключить кодировку aws-chunked в boto3?
  3. Есть ли специальные заголовки или конфигурации, необходимые в прокси nginx для правильной обработки бинарных загрузок?

Дополнительная информация

  • Django версия: 5.1.7
  • boto3 версия: 1.37.23

Любая помощь или понимание будут очень признательны 🙏!

enter image description here

Пример кода, который я пробовал:

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'})

Вернуться на верх