在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>
我可以将网址图片保存到问题的回形针吗?如果是,我该怎么做?
答案 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
显然这更复杂,但它将确保文件始终具有与内容类型匹配的扩展名。