2017-06-07 4 views
0

Ich versuche, einen einfachen HTTP-Java-Server von Grund auf neu zu erstellen. Im Moment versuche ich, meinen Browser dazu zu bringen, eine .jpg-Datei auf meinen PC zu laden, deshalb Die fo image/jpeg ist hardcoded in die Methode. Die folgende Methode druckt die HTTP-Antwort auf meinen Browser. desiredFile a .jpg Datei namens "Image.jpg" auf meinem Computer gespeichert.JPEG beschädigt nach dem Senden über HTTP

Alles funktioniert gut und mein broser lädt die Datei herunter, aber ich kann sie nicht öffnen. Das Windows Image-Programm sagt mir, dass es "wahrscheinlich beschädigt" ist. Wenn ich die Details des Bildes sehe, kann ich sehen, dass es dieselbe Byte-Größe hat, aber Details wie die Auflösung gehen verloren. `

 byte[] bytes = Files.readAllBytes(desiredFile.toPath()); 

     System.out.println("Attempting to print to client|" + bytes.length 

     output.write("HTTP/1.1 200 OK" + "\r\n" 
         + "Content-type: image/jpeg" + "\r\n" 
         + "Content-length: " + bytes.length + "\r\n" 
         + "Content-Disposition: attachment; filename=Imae.jpg" + "\r\n" 
         + "\r\n"); 

     for (byte currentByte : bytes) 
      output.write(currentByte); 

     output.flush(); 
     output.close(); 

     System.out.println("Printing finished."); 
     ` 

Ist etwas falsch mit der Art, wie ich die Bytes übertrage? Senden von bytes als ganzes Array hat nicht funktioniert, deshalb sende ich jedes Byte nach dem anderen.

Danke!

+0

'" Content-Disposition: Anhang; Dateiname = Imae.jpg "+" \ r \ n "' Ist das ein Tippfehler? Meinst du "Image.jpg"? – Ishnark

+2

Bitte zeigen Sie, wie "Ausgabe" deklariert und geöffnet wird – Joni

+0

Verwenden Sie 'InputStreamReader' durch irgendeine Chance, die Bytes zu lesen? – harshavmb

Antwort

0

Das Problem ist, dass Sie eine OutputWriter verwenden.

Ihre Bytes werden als Zeichen interpretiert, die wiederum als unterschiedliche Bytes kodiert sind. Bei UTF-8 wird das Senden des Bytes 0x80 zum Beispiel zu den zwei Bytes 0xC2 0x80 führen. Dies zerstört das Bild.

Die Tatsache, dass Sie nicht in der Lage waren, das vollständige Array direkt zu senden, ist eine riesige rote Flagge: das sollte offensichtlich funktionieren. Wenn nicht, sollten Sie herausfinden warum. Die Fehlermeldung hat wahrscheinlich erwähnt, dass char[] anstelle von byte[] erwartet wurde, was darauf hinweist, dass Ihre Quelle zeichenbasiert statt bytebasiert ist.

Um es zu beheben, wechseln Sie zu einem PrintStream. Sie können sowohl String für den Header als auch byte[] für den Body ausgeben.

+0

Ja, ich habe es in einen DataOutputStream geändert, der endlich funktioniert hat. Vielen Dank für Ihre Antwort! – IchBinGrumpig

0

Ich bin nicht 100% sicher, aber Sie könnten den Header fehlt:

Accept-Ranges: bytes 
Verwandte Themen