通过回形针从URL保存图像

时间:2010-10-29 07:07:06

标签: ruby-on-rails ruby upload paperclip

请建议我通过Paperclip保存网址图片的方法。

8 个答案:

答案 0 :(得分:192)

在Paperclip 3.1.4中,它变得更加简单。

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

这比open(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"

答案 1 :(得分:151)

这是一个简单的方法:

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"

答案 2 :(得分:15)

首先将带有curb gem的图像下载到TempFile,然后只需分配tempfile对象并保存模型。

答案 3 :(得分:14)

在我使用“open”解析URI之前,它不适用于我。 一旦我加上“开放”就行了!

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

我的回形针版本是4.2.1

在打开之前,它不会检测内容类型,因为它不是文件。它会说image_content_type:“binary / octet-stream”,即使我用正确的内容类型覆盖它也不行。

答案 4 :(得分:3)

它可能对您有所帮助。以下是使用回形针和远程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

答案 5 :(得分:3)

因为那些旧的答案在这里是一个较新的:

将图像远程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。

更新您的表单,如果您允许其他人上传图片来自网址

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

答案 6 :(得分:2)

这是一个硬核方法:

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。

答案 7 :(得分:0)

此处https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL

报告了官方文档

无论如何,它似乎没有更新,因为在回形针的最新版本中,某些内容已更改,并且此行代码不再有效:

user.picture = URI.parse(url)

它引发错误,特别是引发此错误:

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对此进行了测试,并且可以正常工作。