即使设置了 DISCOURSE_S3_CDN_URL,来自 S3 的下载仍然会出现

I followed the guide at Using Object Storage for Uploads (S3 & Clones) to set up Backblaze B2 for upload storage and I’m seeing a strange problem.

If I create a thread and upload an image the img src is set to my S3_CDN_URL. If I upload a zip file the URL is at /uploads and redirect directly to my bucket instead of using the S3_CDN_URL. I do not have DISCOURSE_CDN_URL set - the guide indicate it doesn’t affect this issue.

Me relevant settings are:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-west-000"
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  DISCOURSE_S3_ENDPOINT: "https://s3.us-west-000.backblazeb2.com"
  DISCOURSE_S3_ACCESS_KEY_ID: "ID"
  DISCOURSE_S3_SECRET_ACCESS_KEY: "KEY"
  DISCOURSE_S3_CDN_URL: "https://devforum-b2-cdn.freetls.fastly.net"
  DISCOURSE_S3_BUCKET: "bucket-name"
  DISCOURSE_S3_BACKUP_BUCKET: "backup-bucket/devforum"
  DISCOURSE_BACKUP_LOCATION: s3

Why would zip files be handled differently than images?

1 个赞

这个存储方面的问题及其配置,确实是多年来的一个大挑战。

我之前将我的图片存储在Aws S3上。然后我又将存储转换回本地服务器。现在有数百张图片突然消失了。

虽然这不是直接回应或评论你的问题,但我只是对类似的问题表示同情。

查看站点设置:S3 使用 CDN URL 进行所有上传

将 CDN URL 用于上传到 s3 的所有文件,而不仅仅是图片。

1 个赞

谢谢。
我已经把它分配给我的一位本地朋友了。他正在处理。
不过,在你询问之后,我刚刚选择了这个选项。使用 CDN URL 来代替仅用于图片的上传到 s3 的所有文件。

但似乎还有其他问题。他已将 s3 存储迁移到本地服务器。现在我的许多旧帖子,如果原来有 10 张照片,大约一半显示,另一半不显示。(其中一个主题的示例

他将在即将到来的周末着手解决这个问题。



在此之前,在他询问我之前,我天真地选择了将所有图片包含在我的备份中,然后恢复了该备份,以为这会将所有图片恢复到本地服务器,认为这足以将所有图片从 s3 迁移到本地。
但事实并非如此简单(正如我在 meta 上许多相关主题中发现的那样)。

抱歉。我指的是另一个问题。

我敢肯定,您的问题要复杂得多。

这确实很复杂。

我认为该帖子中丢失的图片是因为 Upload 记录不存在,所以您需要做些什么来恢复该图片。我可能错了。

如果我没错,以下是我之前解决类似问题的方法。我在此脚本之外不提供任何免费支持。

def process_uploads
  begin
    # 读取文件名列表
    filenames = File.readlines('/shared/uploads/allfiles.txt').map(&:strip)
    count = 0

    filenames.each do |filename|
      # 在文件名开头添加 /shared
      filename.gsub!(/\.\//,"")
      full_path = File.join('/shared/uploads/default/original/', filename)

      begin
        # 检查路径是否存在且为常规文件(非目录)
        count += 1
        
        if File.exist?(full_path) && File.file?(full_path)
          # 打开文件
          File.open(full_path, 'r') do |tempfile|
            # 使用指定参数创建上传
            u = UploadCreator.new(tempfile, 'imported', {}).create_for(-1)
            puts "#{count} -- #{u.id}: #{u.url}"
          end
        else
          puts "警告:路径未找到或不是常规文件:#{full_path}"
        end
      rescue => e
        puts "处理文件 #{full_path} 时出错:#{e.message}"
        # 即使当前文件失败,也继续处理下一个文件
        next
      end
    end
  rescue Errno::ENOENT
    puts "错误:找不到 files.txt"
  rescue => e
    puts "读取 files.txt 时出错:#{e.message}"
  end
end

# 执行处理
process_uploads;
1 个赞