13

我使用django-storageswiths3boto作为后端。

我有一个带有两个文件夹的存储桶 - 一个static用于media. 我使用django-s3-folder-storage.

除了使用模型保存到 S3 之外,我还想实现一个图像调整大小和缓存功能来将文件保存到 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>

测试我们正在访问正确的存储桶 -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.metadataand test.key.set_metadata。他们都没有这样做。

如何设置正确的 Content-Type?

4

4 回答 4

2

如果您在 classS3BotoStorageFile和 function中查看源代码write,则标题仅从 2 个位置更新,

  1. upload_headers.update(self._storage.headers)self._storage.headers取自哪里AWS_HEADERS
  2. self._storage.default_acl

并且_flush_write_bufferself._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 回答
2

这仅适用于 Boto3,不适用于 Boto。如果您想设置这些标头,则需要像这样访问对象,file_ 引用具有存储设置的 FileField 以使用 django-storages 中的 Boto3:

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

注意:它要求标题名称是驼峰式,所以Content-Type= ContentTypeContent-Dispostion=ContentDispostion等。希望这会有所帮助!

于 2019-05-16T21:07:44.807 回答
1

According to this answer, the Content-Type isn't metadata but rather headers that you set up when you upload the file.

于 2013-08-01T11:54:26.480 回答
1

现在您可以使用django-storages >= 1.4它了,它会自动猜测 mime 类型。

于 2016-07-07T21:55:43.970 回答