Как я могу передать двоичный поток (чтение из файла .jpg, около 1M) из плагина firefox в javascript, размещенный на странице?

Недавно я работаю над проектом, которому нужно передать двоичный поток из плагина npapi в javascript, я пробовал следующие способы:

  1. используйте NPN_InvokeDefault, я создал вариант строки, в котором хранится двоичный поток, и вызываю его в javascript, это не удалось. (я пытался передать двоичный поток чтения из файла XXX.txt, он работает!)

  2. я пытался использовать NPN_NewStream, пример указан в http://www.terraluna.org/dgp/cvsweb/PluginSDK/Documentation/pi3.htm#npnnewstream работает, но картинка загружается в новой вкладке браузера, я не знаю, как получить ее в javascript.

Кто-нибудь сталкивался с подобной проблемой раньше? или, может быть, npapi не поддерживает такую ​​​​передачу данных?

с нетерпением жду ваших предложений, большое спасибо.


person brianchai    schedule 14.05.2012    source источник


Ответы (1)


К сожалению, NPAPI никогда не разрабатывался с этой целью. Есть несколько способов сделать это, и ни один из них не является идеальным:

  • Вы можете создать массив javascript и передавать данные небольшими фрагментами по 1-4 байта (это действительно очень неэффективно).
  • Вы можете создать веб-сервер, встроенный в плагин, и запросить оттуда данные (я сделал это, и это может работать довольно хорошо, но имейте в виду, что если вы используете это с веб-сайта SSL, вы получите предупреждения безопасности, когда встроенный веб-сервер не SSL)
  • Вы можете кодировать двоичные данные в base64 и отправлять их в виде строки.

Вот как я это видел. Причина, по которой вы не можете отправить фактические двоичные данные напрямую в виде строки, заключается в том, что NPAPI требует, чтобы строковые данные были в кодировке UTF8, но если вы кодируете их в base64, тогда все работает нормально.

Извините, я не могу дать вам «более счастливое» решение :-/

person taxilian    schedule 14.05.2012
comment
Спасибо, таксист, ваше предложение действительно полезно! На самом деле я попробовал ваше третье решение, и Base64 работает хорошо - теперь я могу передать изображение на страницу js. И вот еще проблема: я могу передать 100-килобайтную картинку, но когда я пытаюсь сделать 1-мегапиксельную картинку, плагин-контейнер firefox становится занятым (25% процессора) и, наконец, падает... Интересно, есть ли какое-либо ограничение по размеру в этом вид передачи данных? - person brianchai; 16.05.2012
comment
Может быть; Я никогда не делал такую ​​большую струну. Кроме того, добро пожаловать в stackoverflow =] Не забывайте всегда голосовать за полезные ответы или комментарии и отмечать ответы как правильные, если они являются лучшим ответом. Вы можете подождать, чтобы увидеть, появится ли лучший ответ, если хотите, конечно. - person taxilian; 16.05.2012
comment
@brianchai: Не совсем ожидаемый вариант использования, но если это воспроизводимо, пожалуйста, сообщите об ошибке :) - person Georg Fritzsche; 16.05.2012