ActiveStorage, как предотвратить повторную загрузку файлов; найти по имени файла - PullRequest
0 голосов
/ 15 января 2019

Я анализирую вложения электронной почты и загружаю их в ActiveStorage в S3.

Мы бы хотели, чтобы он игнорировал дубликаты, но я не вижу запросов по этим атрибутам.

class Task < ApplicationRecord
  has_many_attached :documents
end

тогда в моей работе по электронной почте webhook

attachments.each do |attachment|
  tempfile = open(attachment[:url], http_basic_authentication: ["api", ENV.fetch("MAILGUN_API_KEY")])

  # i'd like to do something like this      
  next if task.documents.where(filename: tempfile.filename, bytesize: temfile.bytesize).exist?

  # this is what i'm currently doing
  task.documents.attach(
    io: tempfile,
    filename: attachment[:name],
    content_type: attachment[:content_type]
  )
end

К сожалению, если кто-то пересылает те же файлы, мы дублируемся и часто больше.

Редактировать с текущим решением:

tempfile = open(attachment[:url], http_basic_authentication: ["api", ENV.fetch("MAILGUN_API_KEY")])
md5_digest = Digest::MD5.file(tempfile).base64digest

# if this digest already exists as attached to the file then we're all good.
next if ActiveStorage::Blob.joins(:attachments).where({
    checksum: md5_digest, 
    active_storage_attachments: {name: 'documents', record_type: 'Task', record_id: task.id
  }).exists?

1 Ответ

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

Что произойдет, если они все равно изменят имя файла (что часто случается с такими вещами, как filename(2).xlsx) , но содержимое остается тем же?

Может быть, лучшим подходом будет сравнение контрольной суммы? Я считаю, что объект ActiveStorage уже будет хранить это, для сохраненных файлов. Вы можете сделать что-то вроде:

attachments.each do |attachment|
  tempfile = open(attachment[:url], http_basic_authentication: ["api", ENV.fetch("MAILGUN_API_KEY")])
  checksum = Digest::MD5.file(tempfile.path).base64digest

  # i'd like to do something like this      
  next if task.documents.where(checksum: checksum).exist?

  #...
end

Таким образом, вы знаете, что это один и тот же физический файл независимо от входящего имени файла.

...