2013-06-10 5 views
10

Я использую django-storages с s3boto как бэкэнд.Как вы устанавливаете «Content-Type» при сохранении на S3 с помощью django-хранилищ с бэкэндом S3boto?

У меня есть одно ведро с двумя папками - одно для static и одно для media. Я достигаю этого, используя django-s3-folder-storage.

Как и сохранение на S3 с использованием модели, я также хочу реализовать функцию resize-and-cache для сохранения файлов на S3. Для этого я напрямую взаимодействую с ведром S3. Код работает, но Content-Type не установлен на S3.

в IPython:

In [2]: from s3_folder_storage.s3 import DefaultStorage 

In [3]: s3media = DefaultStorage() 

In [4]: s3media 
Out[4]: <s3_folder_storage.s3.DefaultStorage at 0x4788780> 

Test мы доступ правильное ведро - storage_test это один я создал ранее:

In [5]: s3media.exists('storage_test') 
Out[5]: True 

In [6]: s3media.open("test.txt", "w") 
Out[6]: <S3BotoStorageFile: test.txt> 

In [7]: test = s3media.open("test.txt", "w") 

In [8]: test 
Out[8]: <S3BotoStorageFile: test.txt> 

In [9]: test.key.content_type = "text/plain" 

In [10]: test.write("...") 

In [11]: test.close() 

In [12]: test = s3media.open("test.txt", "w") 

In [13]: test.key.content_type 
Out[13]: 'binary/octet-stream' 

Я также попытался вместо In [9] используя test.key.metadata и test.key.set_metadata. Никто из них не делает этого.

Как установить правильный тип содержимого?

ответ

1

Согласно this answer, Content-Type не является метаданных, а скорее заголовками, которые вы настроили при загрузке файла.

2

Если вы идете через исходный код в классе S3BotoStorageFile и функции write, заголовок обновляется только из 2 мест,

  1. upload_headers.update(self._storage.headers) где self._storage.headers берется из AWS_HEADERS
  2. self._storage.default_acl

И в функции _flush_write_buffer рассматривается только self._storage.headers. Проверьте на линии headers = self._storage.headers.copy()

Так что обновление test.key.content_type не будет работать.

Вместо test.key.content_type = "text/plain" в In [9]: попробуйте использовать test._storage.headers['Content-Type'] = 'text/plain', он должен работать.

1

Теперь вы можете просто использовать django-storages> = 1.4, и он автоматически угадывает типы mime.