2013-06-10 44 views
10

Tôi đang sử dụng django-storages với s3boto làm phụ trợ.Làm thế nào để bạn đặt "Content-Type" khi lưu vào S3 bằng cách sử dụng django-storages với phần phụ trợ S3boto?

Tôi có một nhóm với hai thư mục - một cho static và một cho media. Tôi đạt được điều này bằng cách sử dụng django-s3-folder-storage.

Cũng như lưu vào S3 bằng cách sử dụng một mô hình, tôi cũng muốn thực hiện chức năng chỉnh sửa kích thước và lưu trữ hình ảnh để lưu các tệp vào S3. Để làm điều này, tôi tương tác trực tiếp với thùng S3 của tôi. Mã hoạt động, nhưng Content-Type không được đặt trên S3.

trong 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> 

thử nghiệm chúng tôi truy cập vào xô đúng - storage_test là một trong tôi đã tạo trước đó:

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' 

Tôi cũng đã cố gắng thay vì In [9] sử dụng test.key.metadatatest.key.set_metadata. Không ai trong số họ làm điều đó.

Làm cách nào để đặt đúng Loại nội dung?

Trả lời

1

Theo this answer, Loại nội dung không phải là siêu dữ liệu mà là các tiêu đề bạn thiết lập khi tải lên tệp.

2

Nếu bạn đi qua các mã nguồn trong lớp S3BotoStorageFile và hoạt write, tiêu đề được cập nhật từ chỉ có 2 nơi,

  1. upload_headers.update(self._storage.headers) nơi self._storage.headers được lấy từ AWS_HEADERS
  2. self._storage.default_acl

Và trong chức năng _flush_write_buffer chỉ self._storage.headers được xem xét. Kiểm tra dòng headers = self._storage.headers.copy()

Vì vậy, việc cập nhật test.key.content_type sẽ không hoạt động.

Thay vì test.key.content_type = "text/plain" tại In [9]: hãy thử sử dụng test._storage.headers['Content-Type'] = 'text/plain', nó sẽ hoạt động.

1

Bây giờ bạn có thể chỉ cần sử dụng django-storages> = 1.4 và nó tự động đoán các loại mime.