Active Storage Rails, избегая повторных загрузок - PullRequest
0 голосов
/ 06 февраля 2020

Приложение Rails 6 использует AWS, и я не хочу загружать дубликаты файлов. Я хочу получить информацию для уже загруженного файла и поместить ее в запись active_storage_attachment для нового элемента.

Я не очень разбираюсь в Rails, но мне кажется, что это своего рода обратный вызов. Итак, я начал с моего контроллера и добавил before_action :dup_check, only: [:new, :edit, :update], а затем получил следующее:

def dup_check
  # Using a file on computer for dev, since I don't know how to capture that info      
  io = "/Users/whatever.jpg"
  # io = @tempfile # @tempfile shows up in iTerm, but gives an error, obviously doesn't exist when compile this page
  new_file_checksum = Digest::MD5.file(io).base64digest
  aws_checksum = ActiveStorage::Blob.find_by(checksum: new_file_checksum)
  if aws_checksum
    aws_blob_id = ActiveStorage::Blob.find_by(checksum: new_file_checksum).id 
  end # don't need to do anything if new_file isn't already uploaded
end # dup_check

Итак, я могу видеть, есть ли какие-либо совпадающие контрольные суммы.

Три вещи так далеко, что я не могу понять.

Сначала, как получить файл, который я пытаюсь загрузить, чтобы получить его контрольную сумму. В журнале терминала ничего нет, пока элемент не будет отправлен.

Во-вторых, как записать запись active_storage_attachment с существующей информацией BLOB-объекта.

В-третьих, как прервать обычный процесс Active Storage, чтобы сделать то, что я хочу.

Обновление: потратил некоторое время на изучение этого вопроса. Многому научился, но если я интерпретирую журнал ниже, то все это автоматически обрабатывается в функции создания контроллера, поэтому мне придется проанализировать это, чтобы сделать это так, как я предлагаю. И это определенно за мной. Попытка сократить журнал с ... для длинной или бессмысленной информации. Также есть несколько встроенных комментариев в квадратных скобках.

Started POST "/years" for ::1 at 2020-02-08 10:34:47 -0800
Processing by YearsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"…", "year"=>{"year_date(1i)"=>"1900", … "documents [i.e. my name for image]"=>[#<ActionDispatch::Http::UploadedFile:… @tempfile=#<Tempfile:/var/folders/f6/…/T/RackMultipart….jpg>, [more fields ], "commit"=>"Create/Update Connection"}
   (0.1ms)  BEGIN
  ↳ app/controllers/years_controller.rb:101:in `block in create'
  Location Load (0.3ms)  SELECT "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT $2  [["id", 188], ["LIMIT", 1]]
  ↳ app/controllers/years_controller.rb:101:in `block in create'
  Person Load (0.1ms)  SELECT "people".* FROM "people" WHERE "people"."id" = $1 LIMIT $2  [["id", 99], ["LIMIT", 1]]
  ↳ app/controllers/years_controller.rb:101:in `block in create'
  Year Create (117.1ms)  INSERT INTO "years" (…]
  ↳ app/controllers/years_controller.rb:101:in `block in create'
  ActionText::RichText Create (0.7ms)  …
  ↳ app/controllers/years_controller.rb:101:in `block in create'

  ActiveStorage::Attachment Load (0.5ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3  [["record_id", 591], ["record_type", "Year"], ["name", "documents"]]
  ↳ app/controllers/years_controller.rb:101:in `block in create'

  ActiveStorage::Blob Create (25.4ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "metadata", "byte_size", "checksum", "created_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["key", "k9vw7pqr6dxj11xoqgo7jpco5mmj"], ["filename", "…"], ["content_type", "image/jpeg"], ["metadata", "{\"identified\":true}"], ["byte_size", 973547], ["checksum", "…"], ["created_at", "2020-02-08 18:34:47.869813"]]
  ↳ app/controllers/years_controller.rb:101:in `block in create'

  ActiveStorage::Attachment Create (0.7ms)  INSERT INTO "active_storage_attachments" ("name", "record_type", "record_id", "blob_id", "created_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "documents"], ["record_type", "Year"], ["record_id", 591], ["blob_id", 510], ["created_at", "2020-02-08 18:34:47.898589"]]
  ↳ app/controllers/years_controller.rb:101:in `block in create'

  Year Update (16.3ms)  UPDATE "years" SET "updated_at" = $1 WHERE "years"."id" = $2  [["updated_at", "2020-02-08 18:34:47.901342"], ["id", 591]]
  ↳ app/controllers/years_controller.rb:101:in `block in create'
   (0.7ms)  COMMIT
  ↳ app/controllers/years_controller.rb:101:in `block in create'
  S3 Storage (640.7ms) Uploaded file to key: … (checksum: a0cTB/iO+fAYIiMKIPH5fg==)
[ActiveJob] Enqueued ActiveStorage::AnalyzeJob (Job ID: …) to Async(default) with arguments: #<GlobalID:… @uri=#<URI::GID gid://…/ActiveStorage::Blob/510>>

Загрузка файла активного хранилища за кадром описывает некоторые процессы, но это немного за мной.

Спасибо за любую помощь.

...