我有一个S3支持的图像模型,使用了carrierwave和fog,我正在用rmagick处理图像并将不同的版本上传到Amazon S3,原始图像和两个较小的版本。 我希望可以公开访问这两个较小的版本,但原始版本受保护,如存储在S3上的不同文件夹中,具有不同的访问权限或类似的东西,以便我可以从我的应用程序后端获取它们,但不能访问公开,只有其他两个版本。
我认为这可以归结为两个问题: 配置carrierwave以将映像版本保存在存储桶上的不同位置,甚至是不同的存储桶。 根据所请求的图像版本配置使用不同访问的carrierwave / fog,以便在我的应用程序前端我可以使用model.image_url(:small),在另一个地方只需要做model.image_url来检索原始版本,使用不同的访问权限。
您对此有何其他想法?
答案 0 :(得分:3)
好的,所以我设法完成了这个:
我为我的存储桶创建了一个策略,说明某些文件夹是公共的,哪些是较小版本的文件夹,其余文件夹是私有的,并配置了carrierwave以将图像存储在不同的路径中。
首先在carrierwave上配置,基本store_dir(它会保存基本版本),你可以随意改变路径。
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}/public"
end
在版块中,我重写了store_dir方法,如下所示:
version :thumb do
process :resize_to_fill => [200, 200]
process :optimize
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}/private"
end
end
这样你最终会得到类似这样的基础版本:
/uploads/model/attribute/id/private/000564cf-c7e9-3d7b-bf7f-48dd-1910667-e0bbd8b3.jpg
并为每个其他版本重写其基本store_dir:
/uploads/model/attribute/id/public/thumb_000564cf-c7e9-3d7b-bf7f-48dd-1910667-e0bbd8b3.jpg
/uploads/model/attribute/id/public/display_000564cf-c7e9-3d7b-bf7f-48dd-1910667-e0bbd8b3.jpg
在此之后,您在亚马逊s3存储桶上定义一个策略,通过路径中的通配符公开访问您的公用文件夹。
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKETNAME/uploads/*/*/*/public/*"
}
]
}
希望它有同样的要求帮助其他人。