避免文件上传命名冲突的策略

Posted

技术标签:

【中文标题】避免文件上传命名冲突的策略【英文标题】:Strategy for avoiding file upload naming conflicts 【发布时间】:2012-09-12 00:28:24 【问题描述】:

我在 Rails 中有一个 webapp,作为 AJAX 文件上传功能。文件上传到远程服务器 (AWS S3)。我目前的策略是在用户提交表单之前将文件上传到temp/ 目录(使用它们的原始名称),然后将它们重命名为其最终名称。

但问题是,如果多个用户尝试同时上传两个同名文件,那么其中一个会覆盖另一个。

我想解决这个问题的策略是在加载上传页面时生成随机 SHA1,将它们存储在本地表中以确保它们是唯一的,并在临时文件重命名时将它们删除。

您认为这种方法有问题吗?

解决这个问题的好策略是什么?

【问题讨论】:

为什么使用 SHA1 而不仅仅是 GUID 或 mktempfile 生成器?在内容上使用 SHA1 的一个原因是,如果预期添加重复资源并且它被用作重复控制的方法并且资源在上传后被认为是不可变的。但是,如果不是这样的话..(然后想象一下两个人同时上传两个空文件)。 【参考方案1】:

一个问题是,如果他们在没有上传任何内容的情况下离开页面,他们的哈希值将留在数据库中,最终会造成混乱。我会避免在数据库中存储任何这种临时的东西。

与其尝试想出自己的方式来命名临时文件,不如使用 ruby​​ tempfile library,它会为您做到这一点?


本来我以为你是把文件上传到ruby服务器,然后自己上传到s3。如果用户直接上传文件,临时文件将无济于事。如果您只想要临时文件的唯一名称,UUID 生成器可能适合您。有一个 Ruby UUID generator gem 旨在不产生重复,即使在分布式环境中也是如此。如果您使用这些命名文件,则无需在数据库中存储任何内容。

【讨论】:

无论如何都需要处理这种清理工作(即使只是临时文件),而且是一项微不足道的维护工作。 问题是文件没有上传到我的本地服务器,而是上传到AWS S3,所以我无法控制它。我已经有一个用于清理超过 24 小时的临时文件的 cronjob,我可以同时轻松地从数据库中删除旧条目。 您的用户是否必须登录才能上传文件,或者任何人都可以上传?

以上是关于避免文件上传命名冲突的策略的主要内容,如果未能解决你的问题,请参考以下文章

Django中对于上传的文件的保存方法(时间+文件名)

JQuery冲突导致文件上传失败

Linux,上传文件、重命名、修改权限、切换用户

django如何给上传的图片重命名(给上传文件重命名)

如何在上传过程中重命名图像文件

jquery文件上传 - 如何覆盖文件不重命名