Ruby on rails 用回形针从URL保存图像

Ruby on rails 用回形针从URL保存图像,ruby-on-rails,ruby,upload,paperclip,Ruby On Rails,Ruby,Upload,Paperclip,请给我建议一种通过回形针从URL保存图像的方法。首先将带有路缘gem的图像下载到临时文件,然后简单地分配临时文件对象并保存模型。首先将带有路缘gem的图像下载到临时文件,然后简单地分配临时文件对象并保存模型。以下是一种简单的方法: require "open-uri" class User < ActiveRecord::Base has_attached_file :picture def picture_from_url(url) self.picture = op

请给我建议一种通过回形针从URL保存图像的方法。

首先将带有
路缘
gem的图像下载到
临时文件
,然后简单地分配临时文件对象并保存模型。

首先将带有
路缘
gem的图像下载到
临时文件
,然后简单地分配临时文件对象并保存模型。

以下是一种简单的方法:

require "open-uri"

class User < ActiveRecord::Base
  has_attached_file :picture

  def picture_from_url(url)
    self.picture = open(url)
  end
end
这里有一个简单的方法:

require "open-uri"

class User < ActiveRecord::Base
  has_attached_file :picture

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

这是一种核心方法:

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。

这是一种核心方法:

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
类模型{:small=>“150x150>”,:thumb=>“75x75>”}
结束

这可能会对您有所帮助。下面是使用回形针和远程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
类模型{:small=>“150x150>”,:thumb=>“75x75>”}
结束

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

def picture_from_url(url)
  self.picture = URI.parse(url)
end
这比open(url)稍微好一点。因为使用open(url),您将获得“stringio.txt”作为文件名。根据上面的内容,您将根据URL获得文件的正确名称。i、 e

self.picture = URI.parse("http://something.com/blah/avatar.png")

self.picture_file_name    # => "avatar.png"
self.picture_content_type # => "image/png"

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

def picture_from_url(url)
  self.picture = URI.parse(url)
end
这比open(url)稍微好一点。因为使用open(url),您将获得“stringio.txt”作为文件名。根据上面的内容,您将根据URL获得文件的正确名称。i、 e

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
*在Rails4中,您必须添加控制器中可访问的属性

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

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

由于这些都是旧答案,这里有一个新答案:

将图像远程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中,您必须添加控制器中可访问的属性

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

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

直到我将“open”用于解析的URI,它才对我起作用。 一旦我添加了“打开”,它就工作了

def picture_from_url(url)
  self.picture = URI.parse(url).open
end
我的回形针版本是4.2.1


在打开之前,它不会正确检测内容类型,因为它不是一个文件。它会说image\u content\u type:“binary/octet stream”,即使我用正确的内容类型覆盖它,它也不会工作。

直到我对解析的URI使用“open”时,它才对我起作用。 一旦我添加了“打开”,它就工作了

def picture_from_url(url)
  self.picture = URI.parse(url).open
end
我的回形针版本是4.2.1


在打开之前,它不会正确检测内容类型,因为它不是一个文件。它会说image\u content\u type:“二进制/八位字节流”,即使我用正确的内容类型覆盖它,它也不会工作。

这里是官方文档中的报告

无论如何,它似乎没有更新,因为在回形针的上一个版本中,某些内容发生了更改,这行代码不再有效:

user.picture = URI.parse(url)
它会引发一个错误,尤其是在以下情况下引发此错误:

Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
我们还需要将这些行添加到config/initializers/paperclip.rb文件中:

Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register

使用回形针版本
5.3.0
对此进行了测试,它可以正常工作。

此处报告了正式文档

无论如何,它似乎没有更新,因为在回形针的上一个版本中,某些内容发生了更改,这行代码不再有效:

user.picture = URI.parse(url)
它会引发一个错误,尤其是在以下情况下引发此错误:

Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
我们还需要将这些行添加到config/initializers/paperclip.rb文件中:

Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register


用回形针版本
5.3.0
对此进行了测试,结果很有效。

我看不出这个答案有什么不对,投了赞成票,因为我看到了反对票。这是最有效的答案()。我不是一个真正的性能极客,但如果你在使用大文件,这真的很重要。我看不出这个答案有什么不对,投赞成票,因为我看到的是反对票。这是最有效的答案()。我不是一个真正的性能极客,但如果你使用的是大文件,这真的会增加。从曲别针维基:我在控制台中成功运行了它,该应用程序在heroku.FYI中,对于S3 URL,我仍然会得到
应用程序/octet\u流
作为
内容类型
。如果你在曲别针被弃用后仍在使用,您可能还需要确保URI IO加载器已加载:纸夹::UriAdapter.register(在配置中,或暂时通过控制台,如果这是您所需要的)方法是正确的,但在最新版本中,sintax已更改!查看我下面的答案=>您需要在曲别针wiki的初始值设定项中添加条目:我在控制台中成功运行了它,该应用程序位于heroku.FYI中,对于S3 URL,我仍然会得到
应用程序/octet\u流作为
内容类型
。如果您在曲别针被弃用后仍在使用它,您可能还需要确保URI IO加载器已加载:纸夹::UriAdapter.register(在配置中,或暂时通过控制台,如果这是您所需要的)方法是正确的,但在最新版本中,sintax已更改!查看下面的我的答案=>如果需要使用
update\u attributes
rename
picture\u from\u url
to
picture\u url=(value)
,则需要在初始值设定项中添加条目。这可能是不安全的,因为用户可以从\u url('/etc/password')调用
user.picture\u。不过,在大多数情况下这可能没问题。为了安全起见,您应该将URI的方案列入白名单,并将私有主机列入黑名单。请参阅下面的答案以获得更好的解决方案。使用
open(url)
,文件名不准确,例如
open-uri20150106-10034-lpd5fm。
而不是
ef3a601e\u ef3d008b\u ef3d0f7e.jpg
。如果需要的话