重新上传Amazon S3 carrierwave上的图片

4
我已经将图片上传到了亚马逊S3存储桶。当我尝试重新生成版本时,它会抛出一个“nil body”异常。
我认为这是由于我们代码中之前的上传设置发生了变化所致。然而,当我执行“pr.image.url”时,它仍然给我原始的图片,所以我尝试了以下操作:
begin 
    User.all.each do |pr|
        if pr.user.present?
           pr.remote_avatar_url = pr.avatar.url
           pr.save!
        end
    end
    rescue
end

但它会抛出一个错误:

ActiveRecord::RecordInvalid: 验证失败:Avatar 尝试下载非通过 HTTP 传输的文件

我知道这是 carrierwave 异常。我想做的是重新上传所有图片(因为 pr.avatar.url 给出的是原始图片),但我不知道该怎么做。任何帮助将不胜感激。

2个回答

0

你在尝试将远程URL存储在名为remote_avatar_url的属性中是正确的。

当尝试将无效的URL保存到模型中时,CarrierWave会抛出“Validation failed: ATTRIBUTE trying to download a file which is not served over HTTP”异常。更具体地说,当下载的文件“scheme”属性与正则表达式/^https/不匹配(意味着URL不以“https”开头)时,CarrierWave :: Uploader :: Download引发了CarrierWave :: DownloadError。您可以在此处查看此逻辑。(特别是,请参见第31行和第69行。)

我不确定这是否是问题,但在将其分配给remote_avatar_url之前,您可以尝试检查pr.avatar.url是否以https前缀开头。

希望这至少有点帮助。


这就是原因,而不是解决方案。对吧?亲爱的,我已经在问题中简要提到了这些事情。:( - Mani
抱歉,我只是想帮助您诊断问题!您考虑过在将pr.avatar.url分配给remote_avatar_url之前将https前缀连接起来吗?这不是一个优雅的解决方案,但值得一试。 - Sherwood Callaway

0

重新上传图像,您需要下载该图像。如果您的 carrierwave 属性是 remote_avatar,那么您可以尝试这样做:

begin 
  User.all.each do  |pr|
      if pr.user.present?
         pr.remote_avatar = File.open(pr.avatar.url, 'rb')
         pr.save!
      end
  end
rescue
end

哦,是的,抱歉。尝试使用require 'open-uri'来引入,然后直接使用open('http://....')(函数名为open而不是File.open)。 - Andrés

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接