Какая-то необъяснимая причина приводит к дублированию копий изображений

Я работаю с размещённым сайтом, на котором отсутствуют некоторые изображения.

Одно из отсутствующих изображений, взятое из предыдущей версии поста, указывает на ссылку: https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/1/16d12d54b3b4ae7aabc8a93417570bce0984e3c9.png

Кажется, что изображение находится в S3, но отсутствует в таблице Uploads. Раньше я мог добавить изображения в новый пост, чтобы создать новую запись об загрузке, что исправляло все посты, использующие это изображение, после их повторной обработки.

Сначала я попробовал вставить URL, надеясь, что Discourse загрузит изображение и создаст запись об загрузке, но этого не произошло. Тогда я загрузил его через браузер, но новое изображение оказалось другим и получило такой URL: https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/d/d59e3eccc6d9d038b6fae8910e787e851c8714de.png (возможно, я перепутал, какое из изображений какое).

Также возникает вопрос, почему записи вообще отсутствуют в таблице Uploads. Я работаю с другим ранее размещённым сайтом, на котором также отсутствует множество записей об изображениях в таблице Uploads. Это, возможно, заслуживает отдельной темы, но может быть связано с текущей проблемой. Для ряда таких изображений я смог найти их в S3, загрузить и создать новую запись об загрузке следующим образом:

  sha1 = Upload.sha1_from_short_url(short_url)
  extension = short_url.split(".").last
  upload = Upload.find_by(sha1: sha1) 
  prefix = "url for the s3 bucket"
  if !upload
    # try to find it in s3
    one = sha1[0]
    two = sha1[1]
    url_link = "#{prefix}/#{one}/#{two}/#{sha1}.#{extension}"
    puts "URL: #{url_link}"
    url = URI.parse(url_link)
    full_filename = url_link.gsub(remove_url, "/shared/uploads/default/")
    filename = "/tmp/#{File.basename(url_link.gsub(remove_url, "/shared/uploads/default/"))}"
    dirname = File.dirname(filename)
    unless File.directory?(dirname)
      FileUtils.mkdir_p(dirname)
    end
    File.open(filename, "w") do |file|
      Net::HTTP.start(url.host) do |http|
        resp = http.get(url.path)
        open(file, "wb") do |file|
          file.write(resp.body)
        end
      end
    end
      # make upload for file
   ...

Похоже, что этот метод исправит около 25% затронутых постов на другом сайте.

Я не совсем понимаю, как заголовок этой темы связан с остальным содержимым.

Оригинал, на который вы дали ссылку, — это PNG-файл размером 14 КБ. Изображение такого небольшого размера не запустит клиентскую процедуру оптимизации изображений.

Тогда я ещё больше запутался: как одно и то же изображение может генерировать два разных SHA1/путь?

Я загрузил изображение из одного бакета и загрузил его через браузер, в результате чего была создана вторая копия того же изображения с другим именем файла. Эти два файла различны; если браузер не изменил его при загрузке, то я не знаю, что ещё могло его изменить.

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