host = program lokalny EXE, host Native messaging
Potrzebuję przesłać pdf z hosta na serwer jako plik pdf.
Pomyślałem, że zakoduję PDF do BASE64 i wyślę w częściach (ograniczenie do 1MB)
NativeMessaging to sposób na obejście problemu braku dostępu javascriptu do lokalnych plików.
Google wymyśliło system komunikatów.
https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging?hl=pl
W skrócie działa to tak:
Javasript strony(tej którą widzimy) wysyła wiadomości do skryptu działającego w tle(strona go nie kontroluje)
Skrypt przesyła wiadomości do hosta
host wysyła do skryptu
skrypt odsyła do strony (interfejs użytkownika)
Całość odbywa się poprzez strumienie stdin i stdout, skryptu i hosta
Wiadomości są przesyłane Jako JSON kodowany do UTF8.
Całość opracowałem i działa dla zwykłych danych tekstowych (tz nie widzę błędów).
Niestety nie działa dla danych binarnych
Wysyłanie komunikatów po stronie Delphi
var utf8: UTF8String;
begin
...
reply := UTF8Encode(Format('{"Wysyłam dane ": "%s" }', ['Plik pdf.']));
WriteMessage(reply);
...
len:=Length(co);
while i < len do
begin
fra:=Copy(co, i, lensend);
reply := UTF8Encode(Format('{"POL": "dane","part":"%s","data":"%s" }', [IntToStr(j),fra]));
WriteMessage(reply);
Memo1.Lines.Add('reply: ' + reply);
inc(i, lensend);
inc(j);
Application.ProcessMessages;
end;
reply := UTF8Encode(Format('{"POL": "%s" }', ['Transfer_complite']));
WriteMessage(reply);
Skrypt pośredniczący zajmuje się połączeniami i tylko przekazywaniem wiadomości w obie strony
Pod spodem łączenie danych otrzymanych z hosta w Javasript
Oczywiście dekodowanie daje błąd.
port.onMessage.addListener(function(msg) {
...
if (msg.POL=="dane") {
plikbase64array+=msg.data;
}
if (msg.POL=="Transfer_complite") {
var encodedString = atob(plikbase64array);