2016-11-19 5 views
3

У меня есть изображения, загруженные в amazon s3 bucket. Когда я попытался recreate_versions!, он дает мне исключение nil body.Reupload images on Amazon 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.

CarrierWave выдает исключение Validation failed: ATTRIBUTE trying to download a file which is not served over HTTP при попытке сохранить неверный URL-адрес модели. Более конкретно, CarrierWave::Uploader::Download вызывает CarrierWave::DownloadError, когда атрибут «схема» загруженного файла не соответствует регулярному выражению/^ https/(это означает, что URL-адрес не начинается с «https»). Вы можете просмотреть эту логику 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 атр является 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') –