26

我找到了 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."
4

5 回答 5

47

有比 httparty 更多的 apiNet::HTTP友好

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
于 2013-08-27T20:18:35.890 回答
17
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> 
于 2013-08-27T20:20:48.937 回答
10

我喜欢使用 RestClient:

file = File.open("/tmp/image.jpg", 'wb' ) do |output|
  output.write RestClient.get("http://image_url/file.jpg")
end
于 2014-07-18T14:50:28.937 回答
2

虽然上面的答案完全正常,但我想我会提到也可以使用 good ol'curl命令将文件下载到临时位置。这是我自己需要的用例。这是代码的粗略想法:

# Set up the temp file:
file = Tempfile.new(['filename', '.jpeg'])

#Make the curl request:
url = "http://example.com/image.jpeg"
curlString = "curl --silent -X GET \"#{url}\" -o \"#{file.path}\""
curlRequest = `#{curlString}`
于 2019-11-14T18:43:56.187 回答
2

如果您想使用 HTTParty 下载文件,可以使用以下代码。

resp = HTTParty.get("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png")

file = Tempfile.new
file.binmode
file.write(resp.body)
file.rewind

此外,如果您想将文件存储在 ActiveStorage 中,请参阅下面的代码。

object.images.attach(io: file, filename: "Test.png")
于 2021-01-19T10:05:10.570 回答