Приложение Rails ActiveStorage к существующему файлу S3 - PullRequest
0 голосов
/ 14 сентября 2018

Я создаю анализатор PDF, который запускает работника Sidekiq для анализа OCR данных из документа, хранящегося в S3.После анализа данные сохраняются в модели документа.

Как добавить существующий файл корзины S3 в Document.attachment.attach в ActiveStorage, не дублируя файл (через File.open и т. Д.) В S3?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Ответ Троя отлично сработал для меня!Я также нашел полезным извлечь метаданные об объекте из экземпляра объекта 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('"',"")
}

У меня только 46 баллов, поэтому я оставил это как ответ вместо комментария: /

0 голосов
/ 27 октября 2018

Это можно сделать с помощью небольших манипуляций с большим двоичным объектом после его создания.

storage.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'] %>

app / models /document.rb

class Document < ApplicationRecord
  has_one_attached :pdf
end

rails console

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

На данный момент вы можете использовать атрибут pdf вашего объекта Documentкак и любое другое активное хранилище.

...