2016-11-19 171 views
3

我有图片上传到amazon s3 bucket。当我尝试recreate_versions!时,它给我一个nil body例外。重新上传亚马逊S3上的图像carrierwave

我认为这是由于我们的代码中以前的上传器设置的变化。然而,当我做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: Validation failed: Avatar trying to download a file which is not served over HTTP

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

回答

0

您是correct试图将远程URL存储在名为remote_avatar_url的属性中。

当试图将无效的URL保存到模型时,CarrierWave抛出Validation failed: ATTRIBUTE trying to download a file which is not served over HTTP异常。更具体地说,当下载的文件“scheme”属性与regex/^ https /(意思是URL不以“https”开头)不匹配时,CarrierWave::Uploader::Download产生CarrierWave::DownloadError。你可以查看这个逻辑here。 (特别是见第31行和第69行。)

我不确定这是否是问题,但您可能会尝试检查pr.avatar.url以查看它是否以https前缀开头,然后将它分配给remote_avatar_url

我希望这至少有点帮助。

+0

这不是理由的解决方案。对 ?亲爱的,我已经在我的问题中提到了这些事情。 :( – ImranNaqvi

+0

对不起,我只是试图帮助你诊断问题!你有没有考虑过将https前缀连接到'pr.avatar.url',然后再将它分配给'remote_avatar_url'?这不是一个优雅的解决方案,但它是值得的尝试。 – Gundam194

+0

是的,它已经在https。谢谢:) - – ImranNaqvi

0

要重新上传图片,你需要下载的图片,如果你的carrierwave attr为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 
+0

它没有发现这样的文件错误 – ImranNaqvi

+0

哦,是的,对不起。试着要求'require'open-uri''并直接'open('http:// ....')'(这个函数是'open'而不是'File.open') –