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

时间:2017-12-13 21:19:41

标签: 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),
}

编辑:

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

2 个答案:

答案 0 :(得分:8)

我做到了!

覆盖var answers = req.body.answer.split(','); 文件中的generate_location

ImageUploader

这会将文件上传到: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

如果你想要其他文件夹,那么&#34; :bucket_name/storage/:album_name/:file_name&#34;您需要更改初始化文件中storage下的prefix

您可能希望在Shrine.storages上使用parameterize(在我的情况下为field_name),因此您不会在路径中包含空格和不需要的字符。

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

如果您有其他工作/更好的解决方案,请同时发布。 感谢。

答案 1 :(得分:0)

这里是一个示例,其中甚至可以从JSON文件中读取更多自定义内容

issue = jira.issue('PROJECT-10', expand='changelog')

for history in issue.changelog.histories:
    for item in history.items:
        if item.field == 'Link':
            print("{} was linked to {} at {}".format(item.toString.split()[-1], issue, history.created))

这允许您通过运行每个循环来获得GUID的位置

{"ID":"14","post_author":"2","guid":"wp-content\/uploads\/2012\/02\/Be-True-Website-Logo3.png","post_type":"attachment","post_parent":"13"}

您也可以在Rails控制台中运行上述文件。

下面是您的上传器的外观...

require 'json'
require 'pry'

file = File.read('files.json')
array = JSON.parse(file)
posts = array[2]["data"] #please change this to match your JSON file

posts.each do |post|
  post_id = post['post_parent']
  if Post.find_by_id(post_id)
    p = Post.find(post_id)
    g = Graphic.new(post_id: post_id)
    g.graphic = File.open(post["guid"])
  else
    g = Graphic.new
    g.graphic = File.open(post["guid"])
  end
  g.save
end