Rails Active Storage和AWS S3:如何通过seed.rb将图像附加到模型,然后将其存储在S3专用存储桶中?

问题描述

对于一个学校项目,我正在开发一个“出售”小猫照片的Rails应用程序。我在线上挑选了10张猫的图片,它们目前在我的计算机上。我正在为数据库使用Postgresql我有一个代表小猫照片的类/模型Item

我正在寻找一种方法,当通过seeds.rb循环生成虚假数据时,将小猫照片附加到每个Item类/模型上,然后将其存储到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

我发现有一个名为aws-sdk-ruby的瑰宝,但我只是找不到关于该主题方法

目前,我只是将我的存储桶公开访问并获取每个存储桶照片的网址,但是对此没有任何API和安全方法...

谢谢大家

解决方法

首先遵循configuring ActiveStorage and S3的指南。然后在模型上设置附件。

class Kitteh < ApplicationRecord
  has_one_attached :photo
end

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

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条记录,并从硬盘驱动器的目录中选择一个随机映像,并将其上传到您已配置的存储中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...