我在 Rails 4 项目中使用carrierwave,文件存储用于开发和测试,雾存储(用于存储在Amazon S3 上)用于生产。
我想用这样的路径保存我的文件:
/model_class_name/part_of_hash/another_part_of_hash/hash-model_id.file_extension
(示例:/images/12/34/1234567-89.png
其中 1234567 是文件内容的 SHA1 哈希值,89 是数据库中关联图像模型的 id)。
到目前为止,我尝试的是:
class MyUploader < CarrierWave::Uploader::Base
def store_dir
"#{model.class.name.underscore}/#{sha1_for(file)[0..1]}/#{sha1_for(file)[2..3]}"
end
def filename
"#{sha1_for(file)}-#{model.id}.#{file.extension}" if original_file
end
private
def sha1_for file
Digest::SHA1.hexdigest file.read
end
end
这不起作用,因为:
model.id
filename
调用时不可用file
store_dir
调用时并不总是可用
所以,来回答我的问题:
- 是否可以在其中使用模型 ID/属性
filename
?这个链接说不应该这样做;有没有办法解决它? - 是否可以在其中使用文件内容/属性
store_dir
?我没有找到这方面的文档,但到目前为止我的经验说“不”(见上文)。 - 您将如何实现文件/目录命名以尽可能接近我在开头概述的内容?