请告诉我一个使用Paperclip从URL保存图像的方法。
在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"
以下是一种简单的方式:
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"
update_attributes
,请将 picture_from_url
重命名为 picture_url=(value)
。 - Daniel Rikowskiuser.picture_from_url('/etc/password')
。在大多数情况下,这可能是可以接受的。 - David Tuiteopen(url)
方法时,文件名不准确,例如 open-uri20150106-10034-lpd5fm.
而非 ef3a601e_ef3d008b_ef3d0f7e.jpg
。 - Joshua PinterURI.parse(url)
代替open(url)
。 - Simon Franzen直到我使用“open”解析URI,它才对我起作用。一旦我添加了“open”,它就能正常工作了!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
我的纸夹版本是4.2.1
在打开之前,它无法正确检测内容类型,因为它不是一个文件。它会说image_content_type:"binary/octet-stream",即使我使用正确的内容类型覆盖它也不起作用。
首先使用 curb
gem 下载镜像到一个 TempFile
,然后只需分配此临时文件对象并保存您的模型即可。
这里报告了官方文档https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
无论如何,它似乎并没有更新,因为在最新版本的paperclip中有些事情已经发生了改变,因此这行代码不再有效:
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 })
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
我使用paperclip版本5.3.0
测试过,它可以正常工作。
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
由于这些是旧的回答,下面是一个更新的版本:
在数据库中为您所需的控制器添加图像远程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中,您需要在控制器中添加attr_accessible。
如果允许其他人从URL上传图片,请更新您的表单
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
是用来做什么的? - Terence Chowsuper
用于调用原始方法,查找方法体的起点是包含原始方法的对象的超类。 - Mini John这是一种高级方法:
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。
application/octet_stream
作为content_type
。 - Joshua Pinter