请建议我一个方法来保存图像从一个网址的回形针。
首先将带有 curb gem 的映像下载到 TempFile,然后简单地分配 temfile 对象并保存模型。
curb
TempFile
这里有一个简单的方法:
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.com/images/logos/ps_logo2.png"
这是一种核心方法:
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)
where Uuid.uuid just makes some random ID.
下面是远程 URL 中使用回形针和图像的代码。
require 'rubygems' require 'open-uri' require 'paperclip' model.update_attribute(:photo,open(website_vehicle.image_url))
In model
class Model < ActiveRecord::Base has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" } end
在回形针3.1.4中,它变得更加简单。
def picture_from_url(url) self.picture = URI.parse(url) end
这比打开(url)稍微好一点。因为对于 open (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"
由于这些都是老的答案,这里有一个新的:
将图像远程 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
*In Rails4 you have to add the attr_accessible in the Controller.
如果允许他人从 URL 上传图像,请更新表单
<%= f.input :image_remote_url, label: "Enter a URL" %>
直到我对解析后的 URI 使用“ open”时,它才起作用。 我一加“打开”就成功了!
def picture_from_url(url) self.picture = URI.parse(url).open end
我的回形针版本是4.2
在打开之前,它不会检测到正确的内容类型,因为它不是一个文件。它会说 image _ content _ type: “ binary/octet-stream”,即使我用正确的内容类型覆盖它,它也不会工作。
成为官方文件报告在这里 https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
Anyway it seems not updated, because in last version of paperclip something has changed and this line of code is no more valid:
user.picture = URI.parse(url)
It raise an error, in particular this error is raised:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
新的正确语法是这样的:
url = "https://www.example.com/photo.jpeg" user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
我们还需要将这些行添加到 config/initializers/paperclip.rb文件中:
Paperclip::DataUriAdapter.register Paperclip::HttpUrlProxyAdapter.register
用 5.3.0版本的回形针测试了一下,它工作正常。
5.3.0