Джанго Хранилища Бото Bad Digest
Я использую хранилище файлов S3 через хранилище boto django-хранилищ на Python 3. Когда я пытаюсь загрузить файл, я получаю эту ошибку:
boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>BadDigest</Code>
<Message>The Content-MD5 you specified did not match what we received.</Message>
...
Файл, который я пытаюсь сохранить, является файлом, загружаемым с запросами. Суть этого заключается в:
import requests
from django.core.files.base import ContentFile
response = requests.get("http://example.com/some_file.pdf")
document_contents = ContentFile(response.text)
my_model.save("filename", document_contents)
Что я делаю неправильно?
2 ответа
Решение
Смотрите эту актуальную проблему с бото: https://github.com/boto/boto/issues/2868
У Бото есть некоторые проблемы со строковым кодированием в Python3. Если вы знаете кодировку, вы используете response.content
вместо response.text
решает проблему:
document_contents = ContentFile(response.content)
У меня была похожая проблема.
Я изменил на boto3 и двигатель хранения на.
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
Наконец, мне также пришлось преобразовать содержимое в двоичный файл с помощью.encode('utf-8')
my_model.save("filename", document_contents.encode('uft-8'))