我正在使用载波,导轨和亚马逊s3。每次保存图像时,图像都显示在s3中,我可以在管理控制台中看到它,其名称如下:
https://s3.amazonaws.com/bucket-name/
uploads/images/10/888fdcfdd6f0eeea_1351389576.png
但在模型中,名称是这样的:
https://bucket-name.s3.amazonaws.com/
uploads/images/10/b3ca26c2baa3b857_1351389576.png
首先,为什么随机名称不同?我在上传器中生成它是这样的:
def filename
if original_filename
"#{SecureRandom::hex(8)}_#{Time.now.to_i}#{File.extname(original_filename).downcase}"
end
end
我知道每次调用都不会产生随机字符串,因为模型中的错误网址是一致的并保存。在图像名称保存并发送到amazon s3之后,在此过程的某个地方必须生成一个新的以保存在模型中。奇怪。
另外,如果不使用正则表达式,我可以将网址与s3 / bucket而不是bucket.s3匹配吗?在carrierwave中有选择吗?
答案 0 :(得分:3)
默认情况下,CarrierWave不存储URL。相反,它会在您每次需要时生成它。
因此,每次调用filename
时,由于Time.now.to_i
,它将返回不同的值。
改为使用created_at
列,或添加新列以存储随机ID或完整文件名。
答案 1 :(得分:2)
我通过保存文件名来解决它,如果它仍然是原始文件名。在上传器中,输入:
def filename
if original_filename && original_filename == @filename
@filename = "#{any_string}#{File.extname(original_filename).downcase}"
else
@filename
end
end
sumbdomain与路径的问题实际上不是问题。它适用于子域。即https://s3.amazonaws.com/bucket-name/
和https://bucket-name.s3.amazonaws.com/
都可以正常使用。