使用Shrine gem将图像上传到s3中的不同文件夹(按专辑名称)

Ziv*_*ili 1 ruby-on-rails amazon-s3 ruby-on-rails-5 shrine

我设法使用shrine将文件上传到s3,但是我试图根据它所属的相册将每张照片上传到不同的文件夹.

让我们说我有一个名为abc::

将图像上传到相册:family应将图像上传到:abc/family/...

将图像上传到相册:friends应将图像上传到:abc/friends/...

我没有找到Shrine.storages在初始化文件中执行此操作的方法.

我想这样做的方法是以某种方式使用default_storagedynamic_storage插件,但我还没有成功.

任何建议/解决方案?

非常感谢 :)

关系: Album has_many :photos Photo belongs_to :album

Photo上课有image_data神社的场地.

我在初始化程序中的代码:(基本的东西)

s3_options = {
  access_key_id:     ENV["S3_KEY"],
  secret_access_key: ENV["S3_SECRET"],
  region:            ENV["S3_REGION"],
  bucket:            ENV["S3_BUCKET"],
}

Shrine.storages = {
  cache: Shrine::Storage::S3.new(prefix: "cache", **s3_options),
  store: Shrine::Storage::S3.new(prefix: "store", **s3_options),
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我发现有一个名为的插件:pretty_location它添加了一个更好的文件夹结构,但它不是我需要的,它添加/Photo/:photo_id/image/:image_name在桶下,但我需要相册名称.

Ziv*_*ili 9

我做的!

通过重写generate_locationImageUploader的文件:

class ImageUploader < Shrine
  def generate_location(io, context = {})
    album_name  = context[:record].album_name if context[:record].album
    name  = super # the default unique identifier

    [album_name, name].compact.join("/")
  end
end
Run Code Online (Sandbox Code Playgroud)

这会将文件上传到: :bucket_name/storage/:album_name/:file_name

如果希望其他文件夹,然后" storage"你需要改变prefixShrine.storages的初始化文件.

您可能需要使用parameterizefield_name(在我的情况album_name.parameterize),所以你不会路径中有空格和不想要的字符.

对于那里寻找答案的人!这对我有用,享受.

如果您有其他工作/更好的解决方案,请发布它.谢谢.