通过回形针保存来自URL的图像

请给我build议一种方法来保存一个来自URL的图像回形针。

这是一个简单的方法:

require "open-uri" class User < ActiveRecord::Base has_attached_file :picture def picture_from_url(url) self.picture = open(url) end end 

然后简单地:

 user.picture_from_url "http://www.google.comhttp://img.dovov.comlogos/ps_logo2.png" 

在回形针3.1.4中变得更加简单。

 def picture_from_url(url) self.picture = URI.parse(url) end 

这比open(url)好一点。 因为打开(url),你会得到“stringio.txt”作为文件名。 通过上面的内容,您将根据URL获取文件的正确名称。 即

 self.picture = URI.parse("http://something.com/blah/avatar.png") self.picture_file_name # => "avatar.png" self.picture_content_type # => "image/png" 

首先下载带有curbgem的图像到TempFile ,然后简单地分配tempfile对象并保存你的模型。

直到我使用“打开”分析的URI,它才起作用。 一旦我添加“打开”它的工作!

 def picture_from_url(url) self.picture = URI.parse(url).open end 

我的回形针版本是4.2.1

打开之前,它不会检测到内容types的权利,因为它不是一个文件。 它会说image_content_type:“二进制/八位字节stream”,即使我用正确的内容types覆盖它,它不会工作。

由于这些都是旧的答案在这里是一个新的:

将图像远程URL添加到数据库中所需的控制器

 $ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string $ rake db:migrate 

编辑你的模型

 attr_accessible :description, :image, :image_remote_url . . . def image_remote_url=(url_value) self.image = URI.parse(url_value) unless url_value.blank? super end 

*在Rails4中,你必须在Controller中添加attr_accessible。

如果您允许其他人从url上传图片,请更新您的表单

 <%= f.input :image_remote_url, label: "Enter a URL" %> 

这是一个硬核的方法:

 original_url = url.gsub(/\?.*$/, '') filename = original_url.gsub(/^.*\//, '') extension = File.extname(filename) temp_images = Magick::Image.from_blob open(url).read temp_images[0].write(url = "/tmp/#{Uuid.uuid}#{extension}") self.file = File.open(url) 

Uuid.uuid只是做一些随机的ID。

这可能对你有帮助。 这里是使用远程URL中存在的回形针和图像的代码。

 require 'rubygems' require 'open-uri' require 'paperclip' model.update_attribute(:photo,open(website_vehicle.image_url)) 

在模型中

 class Model < ActiveRecord::Base has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" } end