3

我设法使用神社将文件上传到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在存储桶下,但我需要专辑名称。

4

2 回答 2

15

我做的!

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

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

如果你想要其他文件夹,那么“ storage”你需要prefixShrine.storages初始化文件中更改。

您可能想parameterizefield_name(在我的情况下album_name.parameterize)上使用,这样路径中就不会有空格和不需要的字符。

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

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

于 2017-12-13T22:31:08.017 回答
0

这是一个从 JSON 文件中读取更多自定义内容的示例

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

这允许您通过像这样运行每个循环来获取 guid 的位置

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

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

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

class GraphicUploader < Shrine
  include ImageProcessing::MiniMagick
  plugin :activerecord
  plugin :cached_attachment_data # for retaining the cached file across form redisplays
  plugin :restore_cached_data # re-extract metadata when attaching a cached file
  plugin :determine_mime_type
  plugin :remove_attachment

  def generate_location(io, context = {})
    name  = super # the default unique identifier

    if io.is_a?(File)
      initial_location  = io.to_path
      new_location      = initial_location.match(/(.*\/).*/)[1]
      final_location = [new_location + name].compact.join # returns original path
    else
      foo = [io.id].compact.join.to_s
    end

    end
  end
end
于 2018-08-29T03:33:27.033 回答