Приложение 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>>
Загрузка файла активного хранилища за кадром описывает некоторые процессы, но это немного за мной.
Спасибо за любую помощь.