如何从ruby中的直接下载链接获取图像?

时间:2019-01-22 21:09:52

标签: ruby-on-rails ruby file

我正在从网站上提取记录,并尝试存储它返回的图像之一(一个BMP文件)。问题是,该网站仅返回直接下载链接,没有预览。很像this link(但我的是BMP而不是PDF)

没有预览,只有立即下载。

似乎没有一种方法可以生成不同的链接,而且我不知道如何使用rails处理此URL!我只需要将其保存到我的项目/本地文件树中即可。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您必须执行3个操作:获取url的内容,将其写入磁盘,然后将其附加到您的模型中。

获取url的内容

Ruby有各种库来处理HTTP获取请求。当然还有标准库Net :: HTTP和其他max所说的HTTP客户端gem。我使用了其中一些,我最喜欢的选择是http.rb,但您可以选择任何喜欢的东西。

将流写入磁盘

您应该选择一个文件夹和一个文件名并写入流。

将数据附加到模型

attachments也有很多宝石可以处理。如果您更喜欢ActiveStorage,则可以检查方法attach

一个简单的实现可能看起来像这样:

# You can use and other HTTP gem or standard Net::HTTP
gem 'http'
require 'http'

url = 'https://www.ruby-lang.org/images/header-ruby-logo.png'

# You can set timeouts and other options here
response = HTTP.follow(max_hops: 2).get(url)

# You can check for statuses or other responses
return if response.status != 200 || response.content_type.nil?

# You can grab filename from url or set another filename
filename = SecureRandom.hex

path = File.join('tmp', filename)

# Write stream somewhere
file = File.open(path, 'wb')
 response.body.each do |chunk|
  file.write(chunk)
end

# Suppose you use ActiveStorage, you can use the `attach` method
your_model.you_attribute.attach(
   io: File.open(path),
   filename: filename,
   content_type: response.content_type.mime_type
 )