2013-08-15 2 views
6

FACEPALM UPDATE: Оказывается, я совсем забыл/упускать из виду тот факт, что я использовал старую вилку S3BotoStorage из https://github.com/gtaylor/django-athumb в моей памяти по умолчанию (даже хотя я установил django-хранилища). Текущая версия django-хранилищ не страдает от этой проблемы. Проблема заключалась в том, что заголовки типа контента были unicode, когда они нажимали boto, а boto избегает unicode, используя urllib.quoteplus перед отправкой его на AWS. Это не ошибка Boto, так как заголовки должны быть преобразованы в строки, отличные от unicode, как-то по HTTP. Для более глубокого анализа см. https://github.com/boto/boto/issues/1669.Файлы загружены в S3 с S3BotoStorage в конечном итоге с неверном спасся мета-данные типа содержимого

Оригинал Вопрос

Я использую django_storage's S3BotoStorage в сочетании с FileField для загрузки файлов на Amazon S3. Вот мое поле:

downloadable_file = FileField(max_length=255, upload_to="widgets/filedownloads", verbose_name="file") 

В настройках:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

Все работает насколько загрузки/загрузка идет.

Однако файлы хранятся в моем ковше с неправильным типом содержимого. Когда я просматриваю метаданные для файлов в моей консоли AWS S3, Content-Type файла отображается как «приложение% 2Fpdf» вместо «application/pdf», которое должно быть.

Escaped content type

В случае, если вы говорите, что не имеет значения, это имеет значение. Встроенный PDF-ридер Google Chrome будет висеть на pdf с недопустимым типом контента, и клиент привлек это к моему вниманию.

Here's an example of a file uploaded through django-storages/boto. Если вы используете встроенный читатель в формате хром, я предполагаю, что он висит, как и для меня и для клиента, который сообщил об этом. Если вы используете браузер без хрома или плагин adobe или загружаете файл на диск, вы, вероятно, будете в порядке.

Если я вручную изменил метаданные содержимого контента с помощью консоли AWS на «application/pdf» (один из стандартных вариантов, который он предоставляет), тогда это будет хорошо.

Я предполагаю, что это ошибка с чем-то внутренним, так как boto создает документ политики AWS для загрузки файла, так как я ничего не делаю вне стандартного использования здесь. Тем не менее, я перешагнул код boto и не могу найти, где это происходит.

Может ли кто-нибудь предложить вам работу или привести меня к нарушившемуся коду в boto, чтобы я мог его исправить и отправить запрос на вытягивание?

бото == 2.9.5 Джанго-хранилища == 1.1.8

ответ

1

Проблема заключалась в том, что я использовал разветвленную/устаревшую версию хранилищ django, которая неправильно конвертировала заголовки типа контента в строки из unicode перед отправкой их на boto, которая преобразует строки unicode в строки ascii (как требуется для HTTP заголовки) с помощью механизма удаления urllib quoteplus. Проблема была устранена путем переключения на текущую версию django-хранилищ.

Для более детального анализа этого вопроса см: https://github.com/boto/boto/issues/1669#issuecomment-27132112

3

Не является прямым ответом на ваш вопрос, но может быть полезным решение. У меня возникли проблемы с использованием django-хранилищ с S3. Я закончил тем, что попробовал cuddly-buddly и был очень доволен этим. Автор основывал его на модуле S3 от django-хранилищ и добавил немало исправлений. Я просмотрел приятельские коммиты и некоторые изменения повлияли на заголовок типа содержимого, но я не могу протестировать его с загрузкой PDF без создания нового проекта django. Тем не менее, я могу проверить, что все мои файлы, загруженные через Django, не имеют искаженных косых черт в поле типа содержимого в метаданных S3.

Если по какой-либо причине вы не можете перейти на соблазнительно-дружелюбно для тестирования, сообщите мне, и я попытаюсь настроить простой проект Django для загрузки некоторых PDF-файлов.

+0

Going наградить щедрот, так как мое время истекает, и это звучит многообещающе. Я дам вам знать, как это происходит. –

+0

Спасибо, я, вероятно, буду возиться с загрузкой PDF в не слишком отдаленном будущем, поэтому я надеюсь, что это сработает. – Fiver

+0

Разве это не сработало? – Fiver