在通过em-http-请求下载图片时,我遇到了问题。
我希望能够将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 \000#en0#\234\355
当以二进制模式保存此字符串时,我可以打开Image。
所以在这个例子中,em-http-请求以某种方式处理数据,而net:http不这样做。
我的问题
使用ruby1.8的
g 29
把我的头撞在墙上约12个小时,任何帮助都将不胜感激!
另外,我正在运行em-http-request,并为Jruby提供了最新版本的Eventmachine。
发布于 2012-10-22 07:01:06
结果表明,这是由于http_parser.rb中的一个bug (0.5.3java)造成的。具体地说:
ret = callback_object.callMethod(context, "on_body", callback_object.getRuntime().newString(new String(data)));使用默认区域设置将字节数组转换为字符串会导致不可预测的行为。修复是在23a1fb5b5a0dc4506995a34ff149f450b8ceaf64中提交的,它使用了一个ByteList:
ret = callback_object.callMethod(context, "on_body", RubyString.newString(runtime, new ByteList(data, UTF8Encoding.INSTANCE, false)));直到有一个新的版本,我想你将不得不建立从主人。
发布于 2012-04-09 14:41:17
我有图像文件下载通过事件机在1.9.3中工作。而且效果很好。在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看起来像jruby的窃听器。
我正在使用以下宝石
em-http-request (1.0.2)
eventmachine (1.0.0.beta.4 java)https://stackoverflow.com/questions/9221989
复制相似问题