我使用django-storages
并s3boto
作为后端。
我有一个包含两个文件夹的存储桶 - 一个用于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
。他们都不这样做。
如何设置正确的内容类型?
答案 0 :(得分:2)
如果您浏览课程S3BotoStorageFile
和功能write
中的源代码,则标题只会从2个位置更新,
upload_headers.update(self._storage.headers)
其中self._storage.headers
取自AWS_HEADERS
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 :(得分: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等。希望这会有所帮助!