2010-03-25 142 views

回答

258

试试这个:

require 'open-uri' 
open('image.png', 'wb') do |file| 
    file << open('http://example.com/image.png').read 
end 
+0

这工作。谢谢。我在图片上试过这个。图像未正确写入文件。就好像它已经被损坏或者其他东西一样。你也可以指导我在Rails应用程序中做同样的事情。我可以在Rails应用程序中使用它吗? – 2010-03-26 03:49:26

+0

是的,您可以在导轨应用程序中使用它。文件写入不正确可能是因为我忘记了在写入二进制模式下打开目标。我现在编辑它。 – Levi 2010-03-26 04:16:12

+3

也应该是'file << open('http://example.com/image.png').read' – mraaroncruz 2011-03-23 14:43:09

4

在标准库中检出Net::HTTP。该文档提供了几个关于如何使用HTTP下载文档的示例。

29

如果您使用回形针,从网址下载现在是自动处理。

假设你有这样的:

class MyModel < ActiveRecord::Base 
    has_attached_file :image, ... 
end 

您的手机型号,只需指定图像的URL,像这样(写在故意手写):

@my_model = MyModel.new 
image_url = params[:image_url] 
@my_model.image = URI.parse(image_url) 

你”你可能想把它放在你的模型中。这也可以在Heroku的临时文件系统上正常工作。

回形针将从那里采取。

来源:paperclip documentation

+0

对于未来的搜索者,回形针不再允许默认情况下:https://medium.com/in-the-weeds/all-about-paperclips -cve-2017-0889-server-side-request-forgery-ssrf-vulnerability-8cb2b1c96fe8 – 2018-01-31 01:04:20

83

更短的版本:

require 'open-uri' 
download = open('http://example.com/image.png') 
IO.copy_stream(download, '~/image.png') 

为了保持相同的文件名:

IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}") 
+1

而且效率更高,因为输出不会作为字符串存储在内存中。 +1 – 2016-06-03 18:56:34

+0

虽然这两个答案都显示实际上很有用,所以像我这样的人可以看到两者,思考差异,然后有意识地选择这个答案,以获得正确的理由:) – 2017-03-17 18:25:41

5

我觉得这是最清楚的方式:

require 'open-uri' 

File.write 'image.png', open('http://example.com/image.png').read 
相关问题