如何从URL下载文件并将其保存在Rails中?


197

我有一个要保存在本地的图像的URL,以便可以使用Paperclip为我的应用程序生成缩略图。下载和保存图像的最佳方法是什么?(我调查了ruby文件的处理,但没有发现任何问题。)

Answers:


315

试试这个:

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

1
这可行。谢谢。我在图像上尝试过。图像未正确写入文件。好像它已损坏或什么。您也可以指导我在Rails应用程序中执行相同的操作。我可以在Rails应用程序中使用它吗?
Alok Swain'3

是的,您可以在Rails应用程序中使用它。文件未正确写入,可能是因为我忘记了以写二进制模式打开目标。我现在将对其进行编辑。
李维

78
这将读取内存中的整个文件。最好的方法是IO.copy_stream(open('http://example.com/image.png'), 'destination.png')
janko-m

3
rails require 'open-uri'
5,2016

1
这个答案对我不起作用。正确答案在这里:stackoverflow.com/a/29743394/1536309
Blair Anderson

147

甚至更短的版本:

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]}")

2
由于输出不作为字符串存储在内存中,因此效率更高。+1
伊泰·格鲁杰夫

2
尽管同时显示两个答案实际上很有用,所以像我这样的人可以看到两个答案,思考差异,然后出于正确的原因有意识地选择此答案:)
Maxwell Evans

30

如果您使用的是PaperClip,现在将自动处理从URL下载。

假设您有类似以下内容:

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的临时文件系统上也可以正常工作。

回形针将从那里拿走。

来源:回形针文档


4
对于未来的搜索,回形针不再允许这种默认:medium.com/in-the-weeds/...
亚历Dunae

14

我认为这是最清晰的方法:

require 'open-uri'

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

鼠尾草我是Rails的新手,在这里我可以在模型或控制器或视图中添加此代码
Adarsh

1
这要看情况,但是通常您会在模型或控制器方法中执行类似的操作。在Rails上下文中,最好使用ActiveStorage之类的框架工具,而不是直接写入磁盘。
Sage Ross

10

在标准库中签出Net :: HTTP。该文档提供了一些有关如何使用HTTP下载文档的示例。


2
这个答案需要更多的可见性,因为Kernel#open它不仅使文件访问成为可能,而且还通过在管道符号(例如open("| ls"))前添加前缀来处理调用。因此,通过对参数使用变量输入,可能会导致严重的安全风险Kernel#open
ConorB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.