【发布时间】:2011-01-31 17:40:56
【问题描述】:
我有一个我想在本地保存的图像的 URL,以便我可以使用 Paperclip 为我的应用程序生成缩略图。下载和保存图像的最佳方式是什么? (我研究了 ruby 文件处理,但没有遇到任何问题。)
【问题讨论】:
标签: ruby-on-rails ruby file-handling
我有一个我想在本地保存的图像的 URL,以便我可以使用 Paperclip 为我的应用程序生成缩略图。下载和保存图像的最佳方式是什么? (我研究了 ruby 文件处理,但没有遇到任何问题。)
【问题讨论】:
标签: ruby-on-rails ruby file-handling
以上所有示例都很棒。 就我而言,我只是想从 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"
【讨论】:
这可能是最简单的方法:
IO.copy_stream(URI.open("https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png"), 'destination.png')
【讨论】:
我认为这是最清晰的方法:
require 'open-uri'
File.write 'image.png', open('http://example.com/image.png').read
【讨论】:
更短的版本:
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]}")
【讨论】:
open 时收到来自 Rubocop 的安全警告。我用URI.parse(url).open 代替了它。在此处阅读有关该警察的更多信息:rubydoc.info/gems/rubocop/RuboCop/Cop/Security/Open
如果您使用的是 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 会从那里拿走它。
【讨论】:
试试这个:
require 'open-uri'
open('image.png', 'wb') do |file|
file << open('http://example.com/image.png').read
end
【讨论】:
IO.copy_stream(open('http://example.com/image.png'), 'destination.png')
require 'open-uri',直接用下面的代码
查看标准库中的Net::HTTP。该文档提供了几个有关如何使用 HTTP 下载文档的示例。
【讨论】:
Kernel#open 不仅可以访问文件,还可以通过前缀管道符号(例如open("| ls"))进行进程调用。因此,在Kernel#open的参数中使用变量输入可能会导致严重的安全风险。