正常的文件夹结构应该很好地支持帽子,主要是避免冲突并确保您用于整个站点的图像的关联是一致的。由于这些原因,您显然不想将所有图像存储在一个文件夹中。
但我认为最好将 user_id 包含在文件夹名称中?
我不会推荐这个,它可能会导致比它的价值更多的问题。使用模型类和您正在做的 id 应该足够了,并且上传者可能在映射图像时遇到问题,例如当不是上传者的用户尝试查看图像时。
将此文件夹移到 public/uploads 文件夹之外是否更好?
由于您使用的是 Amazon S3,因此您的图像实际上并未存储在项目的公共/上传文件中(如果您指的是该文件)。这应该只是 Carrierwave 在上传/调整文件大小时使用的临时文件。如果您担心空间/安全性,您可能需要查看一下并在必要时根据您的需要进行调整。
我不应该为开发、生产和测试环境使用不同的文件夹吗?
如果您愿意,可以使用不同的文件夹:
def store_dir
"#{Rails.env}/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
或者在 Amazon S3 上使用不同的存储桶(推荐):
在config/initializers/fog.rb
类似的东西:
CarrierWave.configure do |config|
config.storage = :fog
config.fog_credentials = {
:provider => <provider>,
:aws_access_key_id => <id>,
:aws_secret_access_key => <key>
}
if Rails.env == "production"
config.fog_directory = 'production'
elsif Rails.env == "development"
config.fog_directory = 'development'
elsif ...
config.fog_directory = '...'
end
end
或者您可以在单独的环境文件中执行类似的操作。
我想以最好的方式覆盖 store_dir 对于一个有数千用户上传每个配置文件大约 15 个文件(存储为完整大小、配置文件和缩略图大小)的站点的站点。
这个存储目录结构应该可以正常工作,就调整大小而言,您应该查看指南。
更新:
对于文件名,我绝对建议将其更改为随机字符串,这样您就可以避免文件夹本身内任何潜在的命名冲突。有人可以上传me.jpg
2 个不同的文件并非不可能。话虽如此,这就是我的做法。
内your_uploader.rb
添加一个文件名方法,它将随机化当前文件名。
def filename
random_token = Digest::SHA2.hexdigest("#{Time.now.utc}--#{model.id.to_s}").first(20)
ivar = "@#{mounted_as}_secure_token"
token = model.instance_variable_get(ivar)
token ||= model.instance_variable_set(ivar, random_token)
"#{token}.jpg" if original_filename
end
这种特殊的安排可能有点矫枉过正,但对我来说已经足够了。
希望这可以帮助!