如何通过HTTP将图像文件下载到临时文件中?

Dog*_*her 24 ruby uri net-http

我已经找到了用于下载图像文件的NET :: HTTP的好例子,我发现了创建临时文件的很好例子.但我不知道如何将这些库一起使用.即,如何在下载二进制文件的代码中创建临时文件?

require 'net/http'

Net::HTTP.start("somedomain.net/") do |http|
    resp = http.get("/flv/sample/sample.flv")
    open("sample.flv", "wb") do |file|
        file.write(resp.body)
    end
end
puts "Done."
Run Code Online (Sandbox Code Playgroud)

fgu*_*len 44

有更多api友好的库Net::HTTP,例如httparty:

require "httparty"

url = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/DahliaDahlstarSunsetPink.jpg/250px-DahliaDahlstarSunsetPink.jpg"

File.open("/tmp/my_file.jpg", "wb") do |f| 
  f.write HTTParty.get(url).body
end
Run Code Online (Sandbox Code Playgroud)

  • 考虑到它是一个图像文件,您可能希望在开始写入文件之前设置`f.binmode`. (3认同)
  • `f.binmode`已被文件打开模式`wb`覆盖.`f.close`是多余的,因为`File.open`块将始终关闭文件,请参阅http://stackoverflow.com/a/4795782/716 (2认同)

mae*_*ics 15

require 'net/http'
require 'tempfile'
require 'uri'

def save_to_tempfile(url)
  uri = URI.parse(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    resp = http.get(uri.path)
    file = Tempfile.new('foo', Dir.tmpdir, 'wb+')
    file.binmode
    file.write(resp.body)
    file.flush
    file
  end
end

tf = save_to_tempfile('http://a.fsdn.com/sd/topics/transportation_64.png')
tf # => #<File:/var/folders/sj/2d7czhyn0ql5n3_2tqryq3f00000gn/T/foo20130827-58194-7a9j19> 
Run Code Online (Sandbox Code Playgroud)

  • 修复是添加"file.binmode". (5认同)
  • 有趣.我在Rails中使用ruby 2.0运行此编码错误:编码:: UndefinedConversionError:"\ x89"从ASCII-8BIT到UTF-8 (4认同)

Dan*_*ier 9

我喜欢使用RestClient:

file = File.open("/tmp/image.jpg", 'wb' ) do |output|
  output.write RestClient.get("http://image_url/file.jpg")
end
Run Code Online (Sandbox Code Playgroud)