2017-06-07 20 views
0

単純なHTTP Javaサーバーを一から作成しようとしています。 現在、私のブラウザにPC上の.jpgファイルをダウンロードさせようとしています。 その理由は です。fo image/jpegはメソッドにハードコードされています。次に、ブラウザにHTTP応答を出力する方法を示します。 desiredFile「Image.jpg」という.jpgファイルがコンピュータに保存されています。HTTP経由で送信した後にJPEGが破損しました

すべてがうまく動作し、私のbroserはファイルをダウンロードしますが、開くことはできません。 Windows Image Programは、「おそらく破損している」と私に伝えています。イメージの詳細を見ると、バイトサイズは同じですが、解像度などの詳細は失われています。 `

 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."); 
     ` 

バイトを送信する方法に問題がありますか?送信bytes全体の配列として、私は他のすべてのバイトを送信している理由は動作しませんでした。

ありがとうございます!

+0

'' Content-Disposition:attachment; filename = Imae.jpg "+" \ r \ n "'これはタイプミスですか?あなたは 'Image.jpg'を意味しますか? – Ishnark

+2

"output"がどのように宣言され開かれているかを表示してください – Joni

+0

あなたはバイトを読み込むために 'InputStreamReader'を使用していますか? – harshavmb

答えて

0

問題は、あなたがOutputWriterを使用していることです。

バイトは文字として解釈され、別のバイトとしてエンコードされます。たとえば、UTF-8では、バイト0x80を送信すると、2バイトが0xC2 0x80になります。これにより画像が破棄されます。

完全な配列を直接送信できなかったという事実は、巨大な赤旗です。これは明らかに機能するはずです。そうでない場合は、理由を調べる必要があります。エラーメッセージはおそらくbyte[]の代わりにchar[]と予想され、ソースがバイトベースではなく文字ベースであることを示しています。

修正するには、PrintStreamに切り替えます。それは、ヘッダーのためのStringとbodyのためのbyte[]の両方を出力することを可能にします。

+0

はい、私は最終的に働いたDataOutputStreamに変更しました。あなたの答えをありがとう! – IchBinGrumpig

0

私は100%わからないんだけど、あなたはヘッダーが存在しない可能性があります:

Accept-Ranges: bytes 
関連する問題