Rails Active Storage & AWS S3 : 如何通过 seeds.rb 将图像附加到模型,然后将其存储在 S3 私有存储桶中?

Rails Active Storage & AWS S3 : How to attach image to model through seeds.rb and then store it in S3 private bucket?

为了一个学校项目,我正在开发一个 Rails 应用程序,该应用程序“出售”小猫的照片。我在网上挑选了 10 张猫的照片,它们目前在我的电脑上。我正在为数据库使用 Postgresql。我有一个 class/model Item 代表小猫照片。

我正在寻找一种方法,当通过 seeds.rb 循环生成假数据时,将小猫照片附加到每个 Item class/model,然后将其存储到已创建的 AWS S3 存储桶(称为 catz-temple)。我在 .env 文件上有我的两个访问和秘密 S3 密钥,我已经像这样修改了我的 storage.yml 文件:

amazon:
    service: S3
    access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
    secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
    region: eu-central-1
    bucket: catz-temple

我发现有一个 gem 叫做 aws-sdk-ruby,但我就是找不到关于这个主题的方法。

目前,我只是将我的存储桶放入 public 访问权限并获取每个存储桶照片的 url,但是没有 API 和安全的方法...

谢谢大家

首先按照 configuring ActiveStorage and S3 的指南进行操作。然后在您的模型上设置附件。

class Kitteh < ApplicationRecord
  has_one_attached :photo
end

使用 ActiveStorage,您可以 directly attach files to records 通过传递 IO 对象:

photos = Rails.root.join('path/to/the/images', '*.{jpg,gif,png}')
100.times do |n|
  path = photos.sample
  File.open(path) do |file|
    Kitteh.new(name: "Kitteh #{n}") do |k|
      k.photo.attach(
        io: file,
        filename: path.basename 
      )
    end.save!
  end
end

此示例使用从您硬盘上的目录中选择的随机图像创建 100 条记录,并将其上传到您配置的存储空间。