更新文件时如何在载波中保留相同的文件名(在Rails中)

使用载波更新图像时,我将其设置为使用型号ID和原始文件名

def filename
 "#{model.id}-#{original_filename}" if original_filename.present?
end

之所以这样,是因为它是我设置载波时发现的默认方式。最近我意识到,如果您更新图像,则指向图像的链接会断开,因为文件名已更新为使用较新的文件名。因此,如果页面链接到旧图像,则该页面不会使用新图像进行更新,而是会变成损坏的图像链接。

我希望它在更新映像时保留旧的文件名,但是无法在文档中以及从谷歌搜索中找到如何执行此操作

编辑

我没有添加很多“用例”,因为我没有认为问题很复杂。

基本上在网站上items已经images分配了他们。我确实看到了不只使用注释的评论,model.id并且@struthersneil清除了为什么存在该评论的原因。考虑到images项目记录是在创建项目时创建的,因此添加映像时它们将永远不会是新记录(因为它只是更新已经存在的记录)。因此,我最好的选择是使用model.id与文件名相同的名称。

我的另一个选择是保留旧图像,以免链接断开。使用此功能的主要问题是用户在网站上创建帖子并链接到帖子中的这些图像(帖子会定期更新,因此我无法在帖子和帖子中的图像上设置一次缓存)。图像将根据与它们关联的项目的新信息进行更新。一旦发生这种情况,帖子中链接的图像将显示过时的信息,并且每次都必须手动更新为新图像。因此,在这种情况下,使图像链接与要更新的图像保持一致是最好的选择

施特雷弗尼尔

original_filename在这种情况下,是上传者刚刚收到的文件的名称。这是文件的原始名称

通过做这个:

 "#{model.id}-#{original_filename}" if original_filename.present?

您要告诉CarrierWave每次使用文件的新名称。听起来您希望给定的模型每次都使用相同的文件名因此,显而易见的选择就是简单地original_filename完全丢弃并单独使用模型ID。

但是,filename自动生成的上传器代码中方法上方的注释表示:

  # Avoid using model.id or version_name here, see uploader/store.rb for details.

这导致了我们...

  # Be careful using record ids as filenames. If the filename is stored in the database
  # the record id will be nil when the filename is set. Don't use record ids unless you
  # understand this limitation.

怎样的一个顺利的。除非您可以保证模型始终具有一个ID(如果它是新ID,就不会为true),那么您就不应使用它model.id来命名文件。

我建议您file_identifier在初始化时为每个模型生成一次唯一的字符串(只要file_identifier尚未设置),然后仅将此唯一的字符串用作文件名即可,例如

class Something < ActiveRecord::Base
  mount_uploader :image, SomeImageUploader

  after_initialize do
    unless self.file_identifier
      self.file_identifier = SecureRandom.hex(32)
    end
  end
end

...以及您的上载器类...

def filename
  model.file_identifier if original_filename
end

现在,您上传的图片将始终覆盖同一文件。但注意:你刚才丢失图像扩展。在我的现代版本的Firefox中,这似乎很好(它可以通过查看图像标题来猜测),但它可能不是最广泛兼容的解决方案。您可以采用的扩展名original_filename并将其添加到此处,但是如果有人先上传png然后上传jpg(结果是两个不同的文件),那么现在回到了原来的问题。

您可以在上传时转换为您选择的固定格式,然后文件名+扩展名将始终相同。

老实说,我认为如果您接受每次上传后文件都有一个新名称,并且将旧文件保留一段固定的时间以继续支持拥有旧链接的用户,那么您的时间会更轻松。(这些链接将变旧多少?如果它位于缓存中,那么为什么只缓存生成的HTML而不缓存图像?)如果您打算在应用程序和用户之间使用CDN服务,则尤其如此。通常的模式是每次使用新的唯一文件名来对文件进行版本控制,CDN将永久缓存一次。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

展平目录,但在新文件名中保留目录名

Vim更新文件名

检查文件名是否存在并在Google脚本中更新文件名

如何从Shell脚本中的旧文件名获取新文件名?

Grunticon:使用svgmin时如何在文件名中保留颜色指令

如何编码我的程序来为目录中的每个新文件创建新文件名?

当文件名包含从Excel表引用的特定字符串时更新文件名

如何在QFileSystemModel中更新文件信息?

如何在Git中更新文件写入权限

如何在laravel中更新文件?

如何将多个文件中的行复制到一个新文件中并保留文件名?

如何复制文件名中带有欧元符号的最新文件?

如何在bash中创建一个在其他函数之间插入新文件名的函数?

如何让 Django 管理员更新文件名

将相同文件名从不同文件夹复制到新文件夹时附加文件名的循环

Notepad ++新文件名

当程序在cshell中循环运行时,如何给新文件名?

如何从 SHNotify 事件 (SHCNE_RENAMEITEM) 中安全地获取新文件名

如何将具有相似文件名的文件移动到 Python 中的新文件夹中

如何从 PDF 文件中提取页面范围并在新文件中保留 PDF 标记

如何从多个 CSV 文件中提取行并将文件名添加到新文件中

如何在不创建新文件的情况下更新文件

如何在现有的tar.gz归档文件中添加/更新文件?

如何生成新的 GUID,然后使用该 GUID 作为文件名写入指定路径中的新文件?

如何在WebStorm中创建新文件时更改显示的文件模板?

如何根据多个文件的结果创建一个新文件,并将文件名保留为第一列?

获取基于文件名python的最新文件

将文件名复制到新文件

当 Firebase 存储中有一个名为相同的现有文件夹时,如何在 Firebase 中创建一个新文件夹