代码之家  ›  专栏  ›  技术社区  ›  alex2k8

使用Ruby RIO gem下载图像

  •  2
  • alex2k8  · 技术社区  · 16 年前

    我的代码:

    require 'rio'
    rio('nice.jpg') < rio('http://farm4.static.flickr.com/3134/3160515898_59354c9733.jpg?v=0')
    

    但是下载的图像被刷新了。这个解决方案有什么错?

    6 回复  |  直到 16 年前
        1
  •  3
  •   vladr    13 年前

    pjb3是正确的。你必须打电话 binmode 在左侧术语中:

    rio('nice.jpg').binmode < rio('http://...')
    

    binmode 两个术语的修饰符:

    rio('nice.jpg').binmode < rio('http://...').binmode
    

    2011年更新

    这两种方法都不管用。在Linux上,在目标上设置.binmode会导致Errno::enoint异常。do:rio('nice.jpg')<里约http://...)。binmode有效

        2
  •  1
  •   pjb3    16 年前

    它对我有用。你在windows上吗?这可能是因为文件没有使用二进制标志打开。

        3
  •  1
  •   simianarmy    15 年前

    我在Linux上下载图像时遇到了类似的问题,我发现这对我很有效:

        4
  •  1
  •   Thomas Dippel    13 年前

    下面是一些简单的ruby代码,用于下载图像

    require 'net/http'
    url = URI.parse("http://www.somedomain.com/image.jpg")
    Net::HTTP.start(url.host, url.port) do |http|
      resp, data = http.get(url.path, nil)
      open( File.join(File.dirname(__FILE__), "image.jpg"), "wb" ) { |file| file.write(resp.body) }
    end
    

    这甚至可以扩展为遵循重定向:

    require 'net/http'
    url = URI.parse("http://www.somedomain.com/image.jpg")
    Net::HTTP.start(url.host, url.port) do |http|
      resp, data = http.get(url.path, nil)
      prev_redirect = ''
      while resp.header['location']
        raise "Recursive redirect: #{resp.header['location']}" if prev_redirect == resp.header['location']
        prev_redirect = resp.header['location']
        url = URI.parse(resp.header['location'])
        host = url.host if url.host
        port = url.port if url.port
        http = Net::HTTP.new(host, port)
        resp, data = http.get(url.path, nil)
      end
      open( File.join(File.dirname(__FILE__), "image.jpg"), "wb" ) { |file| file.write(resp.body) }
    end
    

    它可能被修饰了一些,但是它完成了任务,并且不依赖于任何第三方gems!:)

        5
  •  0
  •   alex2k8    15 年前

    我想这是一只虫子。在windows上,所有0x0A都替换为0x0D 0x0A。因此,它可以在Linux上正常使用(与.binmode一起使用)。

        6
  •  0
  •   Jérôme Verstrynge    13 年前

    image_downloader