EventMachine em-http-request Изображение / PNG Проблема с кодировкой? - PullRequest
1 голос
/ 10 февраля 2012

У меня проблема при загрузке изображения через em-http-запрос.

Я хочу иметь возможность сохранять данные тела http на диск, а затем иметь возможность откройте изображение как обычно, в настоящее время при сохранении полученных данных тела http на диск через бинарную операцию записи я получаю поврежденное изображение.

Когда я отправляю запрос на получение целевого изображения, я получаю следующее усеченная строка в теле.

\ 357 \ 277 \ 275PNG \ г \ п \ 032 \ п \ 000 \ 000 \ 000 \ rIHDR \ 000 \ 000 \ 001h \ 000 \ 000 \ 000` \ Ъ \ 002

При использовании net: http для получения изображения я получаю следующую усеченную строку

\ 211PNG \ г \ п \ 032 \ п \ 000 \ 000 \ 000 \ rIHDR \ 000 \ 000 \ 001h \ 000 \ 000 \ 000` \ Ъ \ 002 \ 000 \ 000 \ 000 \ 277 \ 243 \ 177 [\ 000 \ 000 \ 000IDATx \ 234 \ 355]

При сохранении этой строки в двоичном режиме я могу затем открыть изображение в порядке.

Так что в этом случае em-http-request обрабатывает данные некоторым образом, что net: http делает нет.

Мои вопросы,

  1. Я использую ruby ​​1.8. Есть ли здесь проблема с кодировкой, о которой я не знаю?

  2. При использовании em-http-запроса нужно ли декодировать кодирование передачи по частям при загрузке двоичных данных?

  3. Есть ли конкретная опция запроса, которую мне нужно включить в em-http-request получить двоичные данные / изображения с серверов?

  4. После загрузки данных изображения Что мне нужно для преобразования данных изображения em-http-request в правильный формат для сохранения?

В течение примерно 12 часов я бился головой о стену, любая помощь будет принята с благодарностью !!!

Также я запускаю em-http-запрос с последней сборкой Eventmachine для Jruby.

Ответы [ 2 ]

1 голос
/ 22 октября 2012

Оказывается, это связано с ошибкой в ​​http_parser.rb (0.5.3 java).В частности:

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)));

Пока не выйдет новый релиз, я думаю, вам придется строить из master.

0 голосов
/ 09 апреля 2012

У меня есть загрузка файла изображения через eventmachine, работающий в 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)
...