foozmeat
(James Moore)
2021 年1 月 23 日 01:13
1
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 个赞
Bathinda
(Bathinda Helper)
2025 年4 月 23 日 13:18
2
这个存储方面的问题及其配置,确实是多年来的一个大挑战。
我之前将我的图片存储在Aws S3上。然后我又将存储转换回本地服务器。现在有数百张图片突然消失了。
虽然这不是直接回应或评论你的问题,但我只是对类似的问题表示同情。
pfaffman
(Jay Pfaffman)
2025 年4 月 23 日 14:01
3
查看站点设置:S3 使用 CDN URL 进行所有上传
将 CDN URL 用于上传到 s3 的所有文件,而不仅仅是图片。
1 个赞
Bathinda
(Bathinda Helper)
2025 年4 月 23 日 14:30
4
谢谢。
我已经把它分配给我的一位本地朋友了。他正在处理。
不过,在你询问之后,我刚刚选择了这个选项。使用 CDN URL 来代替仅用于图片的上传到 s3 的所有文件。
但似乎还有其他问题。他已将 s3 存储迁移到本地服务器。现在我的许多旧帖子,如果原来有 10 张照片,大约一半显示,另一半不显示。(其中一个主题的示例 )
他将在即将到来的周末着手解决这个问题。
在此之前,在他询问我之前,我天真地选择了将所有图片包含在我的备份中,然后恢复了该备份,以为这会将所有图片恢复到本地服务器,认为这足以将所有图片从 s3 迁移到本地。
但事实并非如此简单(正如我在 meta 上许多相关主题中发现的那样)。
pfaffman
(Jay Pfaffman)
2025 年4 月 23 日 14:38
5
抱歉。我指的是另一个问题。
我敢肯定,您的问题要复杂得多。
Bathinda:
他已将 s3 存储迁移到本地服务器。
这确实很复杂。
我认为该帖子中丢失的图片是因为 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 个赞