2017-02-16 1 views
-1

Also ich versuche, ein Bild mit einer http-Seite wie die, die Sie mit "View Image" in Ihrem Browser erhalten. Ich bin soweit gekommen und habe keine Ahnung, was ich noch tun muss, um Firefox dazu zu bringen, meine verdammten Bilddaten zu lesen.Header erforderlich, um ein Base64-Bild mit Perl anzuzeigen?

open (my $fh, "<", "/where/the/base64_encoded_img/is"); 
local $/= undef; 
my $image = <$fh>; 
close $fh; 
local $/= "\n"; 

use MIME::Base64; 
my $alpha; 
$alpha .= "Content-type: image/png;base64 \n"; #our image is a PNG 
$alpha .= "Content-length: " . MIME::Base64::encoded_base64_length($image) . " \n\n "; 
$alpha .= " "; 
#~ $alpha .= "<img src='$image'/>"; 
$alpha .= "$image"; 
print $alpha; 

Man bedenke, dass ich sowohl mit als auch ohne die versucht "Daten: our_data_type; charset = utf-8; base64" Zeichenfolge vor dem Hash-Bild (Diese Zeichenfolge innerhalb des $ Bild enthalten ist Variable).

+2

Ist das ein CGI-Skript? Es ist nicht notwendig, eine HTTP-Antwort zu erstellen, die ein Image ist. Sende einfach das Bild! Wenn Sie ein PNG direkt als Antwort auf eine HTTP-Anfrage senden (und es nicht in ein und denselben HTML-Code einbetten), ist das 'data:' URI-Schema irrelevant. –

+0

Enthält '$ image' Rohdaten? Dann müssen Sie Base64-codieren, bevor Sie es ausgeben. – mob

+1

Ich bin kein Experte, aber ich sah nie Ihre Notation für Content-Type, mit dem Base64 angehängt. Ich hätte stattdessen eine Content-Transer-Codierung verwendet, um die base64-Sache zu spezifizieren. Ist Ihr Image bereits in Base64 in der Datei? Wenn nicht, werden Sie wahrscheinlich Probleme haben. –

Antwort

1

HTTP überträgt Payloads als Binärdatei einfach in Ordnung. Es gibt keine Möglichkeit, base64 zu verwenden, und es ist auch nicht nötig.

+0

also auf jeden Fall, um es anzuzeigen Muss ich es entschlüsseln lassen? – user4654137

+0

Sie sollten es nicht an erster Stelle codiert haben. – DaSourcerer

+0

Ich versuche dies aufgrund der Tatsache, dass CSS in der Lage sein sollte, Bilder in diesem Format zu halten, ich bin mir nicht sicher, ob ich das gleiche Bild hinzufügen, aber nicht codiert, mit ** ** oder mit ** Hintergrund image: ** und dann Firefox (oder irgendein allgemeiner Browser) wird es nur einmal herunterladen und zwischenspeichern. Versuchen Sie auch zu benchmarken, ob es schneller ist, Bilder in diesem Format von einer DB zu laden; als Blob (normales Bild) oder von der fs selbst. – user4654137

-1
my $image = <$fh>; 

Ich empfehle das nicht. Verwenden Sie Binär lesen.

Fügen Sie einen content-transfer-encoding Header hinzu und Sie können base64 oder binär senden. Deaktivieren Sie das I/O-Caching ($|), oder seltsame Dinge können passieren.

+1

Es gibt kein "content-transfer-encoding" Header-Feld in HTTP. –

+0

Bin-Modus auf einem Base64-kodierten Bild aktivieren? Ich dachte, es ist nur Text? – user4654137

1

Banish base64 aus dem Projekt, und führen Sie diese Minimalversion des Skripts:

open (my $fh, "<", "/where/the/img/is"); 

{ 
    local $/= undef; 
    my $image = <$fh>; 
    close $fh; 
} 

print "Content-Type: image/png\n\n"; 
print $image; 

Beachten Sie, dass der Punkt der local ist, dass der vorherige Wert der Variablen automatisch, wenn die umschließende Block Ende gestellt wird. Wenn Sie es nicht in einen Block setzen und den Standardwert manuell wiederherstellen, tut local nichts für Sie.

Auch sollte dies gut genug sein:

print "Content-Type: image/png\n\n"; 
exec 'cat', '/where/the/img/is'; 
Verwandte Themen