如何重命名所有现有的carrierwave上传文件?

时间:2013-07-03 14:58:49

标签: rename carrierwave

我一直在使用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列。因此,访问其网址会产生404。

1 个答案:

答案 0 :(得分:4)

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

使用filename方法更新您的上传器后,您可以从Rails控制台运行;

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

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

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