EventMachine em-http-request image / png编码问题?

时间:2012-02-10 02:37:38

标签: jruby eventmachine

通过em-http-request下载图片时遇到问题..

我希望能够将http正文数据保存到磁盘然后能够 当前保存检索到的http正文数据时,正常打开图像 通过二进制写操作到磁盘我得到一个损坏的图像。

当我向目标图像发出get请求时,我得到以下内容 在身体中截断了字符串。

\ 357 \ 277 \ 275PNG \ r \ n \ 032 \ n \ 000 \ 000 \ 000 \ rIHDR \ 000 \ 000 \ 001H \ 000 \ 000 \ 000` \ B \ 002

当使用net:http获取图像时,我得到以下截断的字符串

\ 211PNG \ r \ n \ 032 \ n \ 000 \ 000 \ 000 \ rIHDR \ 000 \ 000 \ 001H \ 000 \ 000 \ 000` \ B \ 002 \ 000 \ 000 \ 000 \ 277 \ 243 \ 177 [\ 000 \ 000 \ 000IDATx \ 234 \ 355]

以二进制模式保存此字符串时,我可以打开图像。

所以在这个例子中,em-http-request以某种方式处理数据:http:http 不

我的问题,

  1. 我正在使用ruby 1.8这里有编码问题我不知道吗?

  2. 使用em-http-request时,是否必须解码传输分块编码 下载二进制数据时?

  3. 我是否需要在em-http-request中启用特定的请求选项 从服务器窃取二进制数据/图像?

  4. 下载图像数据后,我需要将em-http请求图像数据转换为正确的格式进行保存?

  5. 在这个问题上,我的头靠在墙上大约12个小时,任何帮助 非常感谢!!!

    此外,我正在为Jruby运行最新版本的Eventmachine运行em-http-request。

2 个答案:

答案 0 :(得分:1)

事实证明这是由于http_parser.rb(0.5.3 java)中的错误造成的。具体做法是:

ret = callback_object.callMethod(context, "on_body", callback_object.getRuntime().newString(new String(data)));

使用默认语言环境将字节数组转换为字符串会导致不可预测的行为。修复程序在使用ByteList的23a1fb5b5a0dc4506995a34ff149f450b8ceaf64中提交:

ret = callback_object.callMethod(context, "on_body", RubyString.newString(runtime, new ByteList(data, UTF8Encoding.INSTANCE, false)));

在有新版本之前,我想你必须从大师那里构建。

答案 1 :(得分:0)

我通过在1.9.3中工作的eventmachine下载图像文件。它工作正常。在jruby 1.6.7中失败

require 'rubygems'
require 'eventmachine'
require 'uuid'
require 'em-http-request'
EM.run do
  http = EventMachine::HttpRequest.new("http://.../image.png").get
  file = File.new("test_image.png", "wb")
  http.stream {|chunk|
    file.write chunk
  }
  http.errback {
    puts "error downloading image"
    file.close
    File.rm(file.path)
    EM.stop
  }
  http.callback {
    puts "success"
    file.close
    EM.stop
  }
end

看起来像一个犹豫不决的虫子。

我正在使用以下宝石

em-http-request (1.0.2)
eventmachine (1.0.0.beta.4 java)