我有一个图像的URL,我想保存在本地,这样我就可以使用Paperclip为我的应用程序生成一个缩略图。下载和保存图像的最佳方法是什么?(我研究了ruby文件处理,但没有发现任何东西。)
x6yk4ghg1#
试试看:
require 'open-uri' open('image.png', 'wb') do |file| file << open('http://example.com/image.png').read end
8fq7wneg2#
一个更短的版本:
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]}")
uxh89sit3#
如果您使用的是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的临时文件系统上也能很好地工作。回形针会把它从那里带走。来源:paperclip documentation
a8jjtwal4#
我想这是最清楚的办法:
require 'open-uri' File.write 'image.png', open('http://example.com/image.png').read
63lcw9qa5#
请查看标准库中的Net::HTTP。该文档提供了几个如何使用HTTP下载文档的示例。
nukf8bse6#
可能最简单的方法是:
require 'open-uri' image_url = "https://i.imgur.com/ZWnhY9T.png" IO.copy_stream(URI.open(image_url), 'destination.png')
5cg8jx4n7#
以上所有的例子都很棒。在我的例子中,我只是想从URL的图像中创建一个下载链接。如果你想让它可以下载(到你的下载文件夹),你可以在你的控制器中使用下面的代码:
require 'open-uri' file_type = url.to_s.split(".")[-1] send_data open(url).read, filename: "some_name.#{file_type}", type: "image/#{file_type}", disposition: "attachment"
kadbb4598#
使用Ruby 3及更高版本时,如果使用接受的答案,您将得到以下错误:没有这样的文件或目录@ rb_sysopen -http://example.com/image.png(错误号::ENOENT)解决方案是使用URI.open代替Kernel.open。示例:
URI.open
Kernel.open
require "uri" download = URI.open('http://example.com/image.png') File.write('~/image.png', download)
8条答案
按热度按时间x6yk4ghg1#
试试看:
8fq7wneg2#
一个更短的版本:
要保持相同的文件名:
uxh89sit3#
如果您使用的是PaperClip,则现在会自动处理从URL下载。
假设你有这样的东西:
在您的模型上,只需将图像指定为URL,如下所示(用精心设计的手写体书写):
你可能想把它放在模型的一个方法中,这在Heroku的临时文件系统上也能很好地工作。
回形针会把它从那里带走。
来源:paperclip documentation
a8jjtwal4#
我想这是最清楚的办法:
63lcw9qa5#
请查看标准库中的Net::HTTP。该文档提供了几个如何使用HTTP下载文档的示例。
nukf8bse6#
可能最简单的方法是:
5cg8jx4n7#
以上所有的例子都很棒。在我的例子中,我只是想从URL的图像中创建一个下载链接。
如果你想让它可以下载(到你的下载文件夹),你可以在你的控制器中使用下面的代码:
kadbb4598#
使用Ruby 3及更高版本时,如果使用接受的答案,您将得到以下错误:
没有这样的文件或目录@ rb_sysopen -http://example.com/image.png(错误号::ENOENT)
解决方案是使用
URI.open
代替Kernel.open
。示例: