【问题标题】:How can I rename all the existing carrierwave uploaded files?如何重命名所有现有的carrierwave 上传文件?
【发布时间】:2014-04-02 02:35:22
【问题描述】:

我使用 Carrierwave 上传文件已有一段时间了。我没有尝试在上传文件时重命名它们。现在我想给每个文件一个随机的名称和一个与内容类型一致的文件扩展名。我阅读了 wiki 和其他网站,建议在上传器中,我可以:

def filename
  "#{secure_token}.#{file.extension}" if original_filename.present?
end

private
def secure_token
  #implement the secure token
end

在将这些添加到上传器之后上传的文件运行良好。但是我收到了很多在此更改之前上传的文件。我想知道是否有人可以告诉我如何迁移旧文件。

我尝试向上传器添加一个方法:

def rename_file!
  model.update_attribute mounted_as, "#{secure_token}.#{file.extension}"
  recreate_versions!
end

然后在 Rails 控制台中,我尝试在带有附件的模型上调用它。但是,我发现模型的mounted_as 列从未更新,尽管在文件系统上,使用新名称创建了文件的各种版本。当我检查模型的mounted_as 字段时,它没有得到更新。日志实际上说该列已使用旧值进行了更新。

如何更新模型上的mounted_as 列?

此外,旧名称的旧文件似乎仍在文件系统上。有没有办法删除它们?我尝试添加一行:

file.move_to File.join("#{File.dirname file.path}, "#{secure_token}.#{file.extension}")

rename_file! 方法中。它重命名了文件,但没有更新模型上的mounted_as 列。所以访问它的 URL 会导致 404。

【问题讨论】:

  • 我会在 rake 任务中这样做

标签: rename carrierwave


【解决方案1】:

我知道这有点老了,但也许对其他人有用。

在使用 filename 方法更新您的 Uploader 后,就像您一样,您可以从 Rails 控制台运行它;

Post.all.each do |p|
  p.avatar.recreate_versions!
  p.save!
end

在当前版本的 CarrierWave 中,这将重命名文件并更新模型记录。

Post 当然是型号名称,avatar 是您安装上传器的列,因此请根据需要进行更改。

【讨论】:

猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 2011-05-25
  • 2015-03-30
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2017-04-14
  • 2012-08-02
相关资源
最近更新 更多