在rails中保存数据库中的图像

时间:2014-04-03 20:38:03

标签: ruby-on-rails httprequest

在ruby on rails项目中,我从用户处获取一个url并使用http请求下方,然后将结果显示给用户。代码如下所示:

problem.rb:

class Problem < ActiveRecord::Base
  def content_length

    uri = URI.parse("http://png-4.findicons.com/files/icons/1607/ruby_on_rails/256/ror_folder_256_v3.png")

    response = Net::HTTP.start(uri.host, uri.port) { |http| http.request_head(uri.path)}
    response["content-length"].to_i
  end
end

我获取此网址的图片,并向用户显示网址的大小和图片:

show.html.erb:

<p>
  <strong>Image Size:</strong>
  <%= number_to_human_size(@problem.content_length) %>
</p>

<p>
  <strong>Image:</strong>
  <%= image_tag(@problem.url) %>
</p>

现在,我将url保存到数据库中,但我想在数据库中保存此url的图像。如何将图像保存到数据库中?

问题模型,有一个回形针方法,可以从下面的代码上传图像:

<div class="field">
  <%= f.label :photo %><br>
  <%= f.file_field :photo %>
</div>

我可以将网址图片保存到问题的回形针吗?如果是,我该怎么做?

1 个答案:

答案 0 :(得分:1)

只要您使用Paperclip 3.1.4或更高版本,它就像在您的模型上设置回形针一样简单:

class Problem
  has_attached_file :image
end

然后分配并保存:

def attach_picture_from_url(url)
  @problem.image = URI.parse(url)
  @problem.save!
end

使用Paperclip 4可以进行验证,以确保某人不会欺骗内容类型。如果您提取的网址缺少正确的扩展名(例如http://exmample.com/foo返回您的jpeg),那么您将收到有关扩展程序与检测到的内容类型不匹配的错误。如果这是一个用例,那么你可以这样做:

require 'open-uri'
def attach_picture_from_url(url)
  image_handle = open url
  raise "Not an image" unless image_handle.content_type.start_with? 'image/'
  extension = image_handle.content_type.gsub 'image/', ''

  temp_file = Tempfile.new ['image', extension]
  temp_file.write image_handle.read
  temp_file.close

  @problem.image = temp_file
  @problem_image.save!
ensure
  temp_file.unlink if temp_file
end

显然这更复杂,但它将确保文件始终具有与内容类型匹配的扩展名。