用回形针从 URL 中保存图像

请建议我一个方法来保存图像从一个网址的回形针。

60553 次浏览

首先将带有 curb gem 的映像下载到 TempFile,然后简单地分配 temfile 对象并保存模型。

这里有一个简单的方法:

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版本的回形针测试了一下,它工作正常。