13

バックエンドとして使用django-storagesしています。s3boto

static1 つは 用、もう 1つは 用の 2 つのフォルダを持つ 1 つのバケットがありますmedia。を使用してこれを達成しdjango-s3-folder-storageます。

モデルを使用して S3 に保存するだけでなく、画像のサイズ変更とキャッシュ機能を実装して、ファイルを S3 に保存したいと考えています。これを行うには、S3 バケットを直接操作します。コードは機能しますが、Content-TypeS3 に設定されていません。

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>

正しいバケットにアクセスしていることをテストします。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'

andをIn [9]使用する代わりに、私も試しました。彼らの誰もそれをしません。test.key.metadatatest.key.set_metadata

正しい Content-Type を設定するにはどうすればよいですか?

4

4 に答える 4

2

classS3BotoStorageFileと functionwriteでソース コードをたどると、ヘッダーが 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'

于 2015-01-27T20:17:15.950 に答える
1

Now you can use django-storages >= 1.4 and it automatically guesses the mime types.

于 2016-07-07T21:55:43.970 に答える