我无法解释的原因导致图像副本重复

我正在处理一个缺少一些图片的托管网站。

其中一张丢失的图片,取自帖子的先前修订版,指向 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 = "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% 的受影响帖子。

我不太明白这个主题的标题和其余部分有什么关系。

您链接的原始文件是一个 14KB 的 PNG。这么小的图片不会触发客户端的图片优化例程。

那么,同样一张图片如何会生成两个不同的 SHA1/路径,我更是感到困惑?

我从一个存储桶下载了这张图片,并通过浏览器上传了它,它生成了同一个图片的第二个副本,但文件名不同。这两个文件是不同的;如果它在上传时没有被浏览器更改,那么我不知道还有什么可能改变了它。

哦。也许存储桶中的图片已经被更改,与上传的原始图片不同,所以它与原始图片不同。那么需要做的是下载原始图片,而不是……不。original 在路径中。