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

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

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

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

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

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

【问题讨论】:

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

标签: ruby-on-rails web-applications concurrency amazon-s3


【解决方案1】:

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

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


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

【讨论】:

  • 无论如何都需要处理这种清理工作(即使只是临时文件),而且是一项微不足道的维护工作。
  • 问题是文件没有上传到我的本地服务器,而是上传到AWS S3,所以我无法控制它。我已经有一个用于清理超过 24 小时的临时文件的 cronjob,我可以同时轻松地从数据库中删除旧条目。
  • 您的用户是否必须登录才能上传文件,或者任何人都可以上传?
猜你喜欢
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2013-03-17
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多