She*_*y S 7 amazon-s3 rails-activestorage ruby-on-rails-5.2
我正在构建一个PDF解析器,该解析器将激发Sidekiq工作者以OCR解析S3中存储的文档中的数据。解析后,数据存储在Document模型中。
如何将现有的S3存储桶文件追加到Document.attachment.attachActiveStorage中,而不在S3中复制文件(通过File.open等)?
Tro*_*roy 11
这可以通过在创建 blob 后对 blob 进行轻微操作来完成。
存储.yml
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: <%= ENV['AWS_REGION'] %>
bucket: <%= ENV['S3_BUCKET'] %>
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/document.rb
class Document < ApplicationRecord
has_one_attached :pdf
end
Run Code Online (Sandbox Code Playgroud)
导轨控制台
key = "<S3 Key of the existing file in the same bucket that storage.yml uses>"
# Create an active storage blob that will represent the file on S3
params = {
filename: "myfile.jpg",
content_type:"image/jpeg",
byte_size:1234,
checksum:"<Base 64 encoding of the MD5 hash of the file's contents>"
}
blob = ActiveStorage::Blob.create_before_direct_upload!(params)
# By default, the blob's key (S3 key, in this case) a secure (random) token
# However, since the file is already on S3, we need to change the
# key to match our file on S3
blob.update_attributes key:key
# Now we can create a document object connected to your S3 file
d = Document.create! pdf:blob.signed_id
# in your view, you can now use
url_for d.pdf
Run Code Online (Sandbox Code Playgroud)
此时,您可以像使用任何其他活动存储附件一样使用对象的pdf属性Document。
小智 5
特洛伊的答案对我很有用!我还发现从对象的s3实例中提取有关该对象的元数据很有帮助。就像是:
s3 = Aws::S3::Resource.new(region: "us-west-1")
obj = s3.bucket("my-bucket").object("myfile.jpg")
params = {
filename: obj.key,
content_type: obj.content_type,
byte_size: obj.size,
checksum: obj.etag.gsub('"',"")
}
Run Code Online (Sandbox Code Playgroud)
我只有46分,所以我把它留为答案而不是评论:/
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |