説明できないことが原因で、画像が重複してコピーされます

ホストされているサイトで画像がいくつか欠落しています。

欠落している画像のうちの1つは、以前の投稿の改訂版から取得されたもので、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で見つけてダウンロードし、次のような新しいUploadレコードを作成することができました。

  sha1= Upload.sha1_from_short_url(short_url)
  extension = short_url.split(".").last
  upload = Upload.find_by(sha1: sha1)
  prefix = "S3バケットのURL"
  if !upload
    # 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
      # ファイルのアップロードを作成
   ...

この方法では、他のサイトで影響を受けている投稿の約25%が修正されるようです。

このトピックのタイトルが本文とどのように関連しているのか、よく理解できません。

リンクされた元のファイルは14KBのPNGです。このサイズの画像では、クライアント側の画像最適化ルーチンはトリガーされません。

では、同じ画像が2つの異なるSHA1/パスを生成している理由がさらにわかりません。

一方のバケットから画像をダウンロードし、ブラウザ経由でアップロードしたところ、異なるファイル名で同じ画像のコピーが2つ生成されました。2つのファイルは異なります。ブラウザでアップロード中に変更されなかった場合、他に何が変更したのかわかりません。

ああ。おそらく、バケット内の画像はアップロードされた元の画像から変更されているため、元の画像とは異なります。したがって、必要なのは元の画像をダウンロードすることです。 . . いいえ。「original」はパスに含まれています。