2

一段时间以来,我一直在使用 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。

4

1 回答 1

4

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

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

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

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

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

于 2014-04-01T18:35:22.293 回答