使用载波更新图像时,我将其设置为使用型号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] 删除。
我来说两句