django-storages with Amazon S3 - 防止覆盖

Posted

技术标签:

【中文标题】django-storages with Amazon S3 - 防止覆盖【英文标题】:django-storages with Amazon S3 - prevent overwriting 【发布时间】:2012-05-06 14:02:17 【问题描述】:

我注意到 django-storages(或者可能是 Django 的存储 API 本身)会覆盖同名文件。这对我来说是个问题,因为我的网站允许用户上传,所以我需要确保文件永远不会被覆盖。

理想情况下,我希望能够从视图级别将文件名传递给存储后端,但我正在努力寻找一种优雅的方式来做到这一点。如果在某个地方有一个开关,我可以做类似overwrite=False 的操作并让后端提供自己的替代名称,我会同样高兴。

【问题讨论】:

【参考方案1】:

如果您在 django-storages 中使用的是 s3boto 后端而不是旧的 s3 后端,那么您可以使用 AWS_S3_FILE_OVERWRITE 设置来更改此设置:https://bitbucket.org/david/django-storages/src/83fa2f0ba20c/storages/backends/s3boto.py#cl-43

【讨论】:

如果我只想在一个特定模型上而不是在系统范围内执行此操作怎么办?【参考方案2】:

@Mark Lavin's answer 恰当地指出将AWS_S3_FILE_OVERWRITE 设置为False 可以避免这个问题。

您可能还想稍微改进一下文件名间距。您可以在 S3 上以您想要的任何名称保存文件(它不必是用户上传的文件的名称)。因此,您可以使用名称“user_uploads/[user_id]/[user_generated_file_name]”保存文件。作为下载的一部分,您还可以将文件名设置为您想要的任何名称。如果您将用户上传的文件名保存为模型上的字段,则可以将其指定为下载文件的视图中的文件名。

【讨论】:

以上是关于django-storages with Amazon S3 - 防止覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Django-storages + boto + S3 collectstatic 的最小凭据

Django-storages 未检测到更改的静态文件

Django-storage - 如何在上传前检查文件大小?

Django:使用 django-storage 从 S3 创建 zipfile

使用 azure 作为 Django 的存储后端(使用 django-storages)

django-storages + sorl_thumbnail + S3 不能很好地协同工作(URL 不匹配)