迁移到新服务器时无法生成用户头像,因为扩展名未知

编辑:我将此问题重新归类为缺陷,以便让比我更懂这方面的人来查看。

许多上传文件的扩展名被标记为“unknown”。这意味着无法生成缩略图。我认为这是在将备份迁移到新站点并随后需要重新生成缩略图时发生的。

我认为,当你尝试生成缩略图但扩展名为“unknown”时,应该替换该扩展名,类似如下操作:

 upload.extension = upload.original_filename.split('.').last

如果能在某个地方实现这一点,我本不必在这上面花费4个小时。

等等。这看起来就是问题所在。为什么要返回 false,而不是从文件名中获取扩展名?

以下是详细情况。

我通过备份和还原的方式,将站点从 /community 迁移到了 community.example.com。我使用以下命令修复了上传文件:

 RAILS_ENV=production bundle exec script/discourse remap '/community/uploads' '/uploads'

但头像仍然显示为“灰人”。

当我查看 user.user_avatar.custom_upload.url 并将该 URL 粘贴到浏览器中时,可以正常显示所需的头像。看来我需要“重新生成”用户数据。

我曾以为运行以下命令或许能解决问题:

rake avatars:refresh

或者

rake avatars:clean

但都没有效果。

我遗漏了什么?

1 个赞

在 Sidekiq 中有一个触发器用于创建缺失的头像。

这需要一些时间,但如果我没记错的话,这应该会有所帮助。

2 个赞

不错!那个调用的是 User.refresh_avatar,但遗憾的是

  user=User.find_by_username('broken_avatar_guy')
  user.refresh_avatar

也无法解决这个问题。

2 个赞

这是一个线索:

ActionController::RoutingError (没有匹配的路由 [GET] "/user_avatar/community.example.com/broken_user")
1 个赞

是否在用户登录账户时执行更新?

我不这么认为。

user.user_avatar.custom_upload 拥有正确的 URL,但 https://community.example.com/user_avatar/community.example.com/bad_user/25/321_2.png 缺失了头像图片。我需要找到重建这些头像缩略图的方法。

我在代码中看到用户登录时有一个 force_avatar_update。

这可能非常有帮助,看起来像是一项工作

一定出了什么问题:

user = User.find_by_username('Tuomo')
upload_id = user.user_avatar.custom_upload.id
upload = Upload.find(upload_id)
Discourse.avatar_sizes.each do |size|
  OptimizedImage.create_for(upload, size, size)
end
OptimizedImage.where(upload_id: upload_id)

我得到的结果是没有优化后的图片。

broken_uploads = Upload.where(extension: "unknown")
broken_uploads.each do |upload|
  upload.extension = upload.original_filename.split('.').last
  upload.save
end

这样就能修复。

然后我只需要生成新的缩略图,如下所示:

has_upload = UserAvatar.where("custom_upload_id > 0")

has_upload.each do |user_avatar|
  Jobs.enqueue(:create_avatar_thumbnails, {upload_id: user_avatar.custom_upload_id})
end
2 个赞

我认为这是一个真正的 bug,并且 Jeff :heart: 了,但它没有得到任何关注。

是我疯了还是这里有什么东西坏了?

2 个赞

我通过备份和还原将一个站点从 /community 迁移到了 community.example.com

我猜我们还没有遇到过这种情况,因为你在这里抱怨的是还原的残留物,对吗?也许是这个备份和还原特有的?

1 个赞