使用Carrierwave从Rails控制台上载远程文件URL

时间:2013-06-04 13:02:39

标签: ruby-on-rails ruby-on-rails-3.2 carrierwave

我只是想知道如何在Rails控制台中使用Carrierwave上传远程文件URL。

我试了以下没有任何运气。我认为它没有处理上传器?

user = User.first
user.remote_avatar_url = "http://www.image.com/file.jpg"
user.save

非常感谢

5 个答案:

答案 0 :(得分:20)

请查看此页面上的“从远程位置上传文件”部分https://github.com/carrierwaveuploader/carrierwave

如果该位置的网址无效,CarrierWave应该抛出错误

2.1.3 :015 > image.remote_image_url = "http"
 => "http"
2.1.3 :016 > image.save!
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image trying to download a file which is not served over HTTP

或者如果它是一个未知主机:

2.1.3 :017 > image.remote_image_url = "http://foobar"
=> "http://foobar"
2.1.3 :018 > image.save!
   (0.4ms)  BEGIN
   (0.4ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image could not download file: getaddrinfo: nodename nor servname provided, or not known

另请注意,如果您要下载远程图片,则应在属性前加remote_,并在_url后加上,如示例所示

答案 1 :(得分:6)

user = User.first
user.remote_avatar = File.open(FILE_LOCATION)
user.save

FILE_LOCATION可以

File.join(Rails.root, '/files/png-sample.png')

如果在文件夹中找到文件'文件'在rails项目中

答案 2 :(得分:4)

我遇到了同样的问题。问题可能是http重定向到https。所以我用gsub替换它们如下:

image.remote_image_url = remote_image_url.gsub('http://','https://')
image.save!

这应该最有可能解决问题。

答案 3 :(得分:0)

工作如下:

url='http://host.domain/file.jpg'    
time=Time.now.to_i.to_s
myfile=IO.sysopen("tmp/"+time+"_img."+url.split(".").last,"wb+")
tmp_img=IO.new(myfile,"wb")
tmp_img.write open(URI.encode(url)).read

if File.exist?("tmp/"+time+"_img."+url.split(".").last)
  "tmp/"+time+"_img."+url.split(".").last
  image = ActionDispatch::Http::UploadedFile.new(:tempfile => tmp_img, :filename => File.basename(tmp_img))
else 
  image=nil
end
@your_model.image=image
@your_model.save

答案 4 :(得分:0)

我遇到了remote_avatar_url无法上传图片或丢失任何错误的问题。对我而言,据我所知,这是因为我在我的模型中设置了以下内容。

attr_accessor :remote_avatar_url

Carrierwave为您介绍了这一点,虽然我不明白为什么,但是自己设置它会让事情变得更糟。