2013-08-12 42 views
6

Czy istnieje sposób na zwrócenie wyniku z phantomJS webserver jako binarnego?Powróć wynik binarny z phantomjs webserver

Mówiąc dokładniej, jeśli zrenderuję zrzut ekranu strony jako base64, czy mogę przekształcić ten ciąg base64 na binarny i zwrócić go, aby klient otrzymał go jako obraz?

To, co do tej pory, mam skomentował niektóre z moich eksperymentów, które najwyraźniej nie robi praca

response.statusCode = 200; 
response.setHeader("Content-Type", "image/png"); 
//response.setHeader("Content-Encoding","base64"); 
var base64 = page.renderBase64('png'); 
//var binary=atob(base64,"b"); 
response.write(base64 ); 
response.close();  

pomysły?

+0

Jeżeli masz jakikolwiek postęp w tej kwestii? – naneri

Odpowiedz

0

Rozwiązaniem jest użycie binary encoding w module serwera WWW i page.evaluate wewnątrz modułu strony internetowej do generowania treści binarnych.

wynik jest mniej więcej tak (zakładając strona jest zdefiniowany):

response.statusCode = 200; 
response.setEncoding("binary"); 
response.setHeader("Content-Type", "image/png"); 
var base64 = page.renderBase64('png'); 
var binary = page.evaluate(function (data) { return atob(data, "b");}, base64); 
response.write(binary) 
response.close(); 
+0

Jego absolutnie niepotrzebne korzystanie z page.evaluate! Jest po prostu wolniejszy! – Lux

+0

Ustawiłem też typ zawartości dla przykładów serwera WWW, dzięki czemu mogę porównywać zrzuty ekranu phantomjs i renderowany kod z moim aktywnym renderowaniem firefoxa. Serwer WWW jest taki fajny. Również możesz zautomatyzować oba testy używając Selenium i UnitTest, jako przykładu. – erm3nda

6

można po prostu ustawić kodowanie binarne, a to będzie działać:

response.statusCode = 200; 
response.headers = { 
    'Cache': 'no-cache', 
    'Content-Type': 'image/png' 
}; 
response.setEncoding('binary'); 
response.write(atob(page.renderBase64('png'))); 
response.close(); 
+0

Co to jest "atob"? – devius

+2

@devius to do odkodowania danych BASE64: [mdn] (https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64) [w3c] (http://www.w3.org/TR /html5/webappapis.html#dom-windowbase64-atob) – Lux

+0

Po prostu natknąłem się na to: kodowanie binarne jest zepsute w obecnym wydaniu PhantomJS (https://github.com/ariya/phantomjs/issues/13026) –