使用带有S3boto后端的django-storages保存到S3时,如何设置“Content-Type”?

时间:2013-06-10 08:28:38

标签: django amazon-s3 boto django-storage

我使用django-storagess3boto作为后端。

我有一个包含两个文件夹的存储桶 - 一个用于static,另一个用于media。我使用django-s3-folder-storage实现了这一点。

除了使用模型保存到S3之外,我还想实现图像调整大小和缓存功能以将文件保存到S3。为此,我直接与我的S3存储桶进行交互。该代码有效,但{1}}未在S3上设置。

在iPython中:

Content-Type

测试我们正在访问正确的存储桶 - 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' In [9]代替test.key.metadata。他们都不这样做。

如何设置正确的内容类型?

4 个答案:

答案 0 :(得分:2)

如果您浏览课程S3BotoStorageFile和功能write中的源代码,则标题只会从2个位置更新,

  1. upload_headers.update(self._storage.headers)其中self._storage.headers取自AWS_HEADERS
  2. self._storage.default_acl
  3. 在功能_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 :(得分:1)

根据this answer,Content-Type不是元数据,而是您在上传文件时设置的标题。

答案 2 :(得分:1)

现在你可以简单地使用django-storages&gt; = 1.4并自动猜测mime类型。

答案 3 :(得分:0)

对我来说这是一个挣扎。这仅适用于Boto3,而非Boto。如果要设置这些标头,则需要像这样访问该对象,file_引用具有存储设置的FileField,以使用django-storages中的Boto3:

file_.storage.object_parameters = { 'ContentType': 'text/plain' }

注意:它要求标头名称为驼峰形,所以Content-Type = ContentType,Content-Dispostion = ContentDispostion等。希望这会有所帮助!