我有一个图像的URL,我想保存在本地,这样我就可以使用回形针为我的应用程序产生一个缩略图。下载和保存图像的最佳方法是什么?(我研究了ruby文件处理,但没有发现任何东西。)
试试这个:
require 'open-uri'
open('image.png', 'wb') do |file|
file << open('http://example.com/image.png').read
end
如果你正在使用回形针,下载从一个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的临时文件系统上正常工作。
回形针会帮你搞定。
来源:回形针文档
一个更短的版本:
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]}")
我认为这是最清晰的方式:
require 'open-uri'
File.write 'image.png', open('http://example.com/image.png').read
可能是最简单的方法:
require 'open-uri'
image_url = "https://i.imgur.com/ZWnhY9T.png"
IO.copy_stream(URI.open(image_url), 'destination.png')
以上所有的例子都很棒。 在我的情况下,我只是想从图像从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"
使用Ruby 3及以上版本,使用已接受的答案,你会得到以下错误:
没有这样的文件或目录@ rb_sysopen - http://example.com/image.png (Errno: ENOENT)
解决方案是使用URI。open代替Kernel.open。例子:
require "uri"
download = URI.open('http://example.com/image.png')
File.write('~/image.png', download)
推荐文章
- Ruby有一个string. startwith ("abc")内置方法吗?
- 如何从URL下载文件并保存在Rails中?
- Rails:缺少要链接的主机!请提供:host参数或设置default_url_options[:host]
- 从字符串中移除子字符串
- Rails。env vs RAILS_ENV
- 如何从Ruby数组中创建平均值?
- 如何在ruby中做一个安全的连接路径名?
- Ruby中没有增量操作符(++)?
- 如何得到一个特定的输出迭代哈希在Ruby?
- Ruby正则表达式中\A \z和^ $的区别
- 我能在视图中得到当前控制器的名称吗?
- __FILE__在Ruby中是什么意思?
- Paperclip::Errors::MissingRequiredValidatorError with Rails
- 如何表达一个NOT IN查询与ActiveRecord/Rails?
- Ruby on Rails form_for选择字段与类