2016-12-17 9 views
-1

ソケットを使用して自分のHTTPサーバーを実装しています。私のjavaプロジェクトフォルダには、ダウンロードできるすべてのファイル(test.html、test.jpg)が保存されているフォルダ/ rootがあります。そのため、ユーザがlocalhost:8080/test.htmlファイルを読み取り、バイトをクライアントのブラウザに送信して、正しいヘッダーを設定します。 .html拡張子ですべてうまく動作しますが、画像に問題があります...ブラウザは、ファイルを正しく表示できないと言います。 は、ここで私は、ファイルからバイトを読み取るために使用するクラスです:Java HTTPサーバー実装がイメージを正しく送信できない

public class FileRequestHandler { 

public FileRequestHandler(){ 

} 

/* 
* Method which reads a text-file and turns it into a string 
*/ 
public String readFile(String file) throws IOException { 
    BufferedReader reader = new BufferedReader(new FileReader (file)); 
    String   line = null; 
    StringBuilder stringBuilder = new StringBuilder(); 
    String   ls = System.getProperty("line.separator"); 

    try { 
     while((line = reader.readLine()) != null) { 
      stringBuilder.append(line); 
      stringBuilder.append(ls); 
     } 

     return stringBuilder.toString(); 
    } finally { 
     reader.close(); 
    } 
} 

} 

readFileの実行後の()私は、文字列を取得します(私は、応答それを呼び出します)。

は今、私はヘッダーを設定し、それをクライアントに送信します。

out.println("HTTP/1.1 200 OK"); 
    out.println("Content-Type: image/jpeg"); 
    out.println("Content-Length: " + response.length()); 
    out.println(); 
    out.println(response); 
    out.flush();  

アウトはPrintWriterオブジェクトです。 すでに述べたように、このメソッドはhtmlファイルで動作し、すべてが表示されます。私は間違って何をしていますか?たぶんrawバイトのエンコーディングが正しくないか、ヘッダーが正しく設定されていませんか? ありがとうございました!

+0

ですから、テキストファイルを処理するために同じ方法を使用していますバイナリファイル(画像)? –

+0

'println()'は使わないでください。 HTTPの行終端文字は、 'println()'が与えるものではなく、 '\ r \ n'として定義されています。 – EJP

答えて

2

イメージはテキストファイルではありません。しかし、あなたは明らかにテキストとしてBufferedReaderを使ってそれを読んでいます。それはそれを悪化させます...そしてreadLine()の使用とライン再アセンブリはそれをもう少しmanglesします。

どちらの方法でも、ブラウザはサーバーが送信しているマングルされたイメージをデコードできません。

Reader/Writerサブタイプではなく、InputStream/OutputStreamサブタイプを使用する必要があります。また、任意の時点でイメージを文字列に変換しないでください。

(I/Oソケットレベルを使用してHTTPサーバを実装しようとすることも悪いアイデアです...しかし、それは別の問題です。)

+0

私はそれをStringに変換できない場合、どうすれば画像をbase64文字列として直接エンコードできますか? – Teo

+0

@Teoなぜですか?バイトを出力に書き込むだけです。 – EJP

+0

なぜそれをbase64文字列としてエンコードしたいですか?あなたのコンテンツタイプは "image/jpeg"と表示され、エンコーディングは指定されていません。あなたがbase64でエンコードされたボディーを送ったなら、それもまたmangledされるでしょう。 –

0
BufferedReader reader = new BufferedReader(new FileReader (file)); 

ここから問題が始まります。読者と作家はテキスト用です。画像はテキストではありません。入力ストリームを使用して、バイトを出力ストリームに直接書き込んで、文字列でそれらを収集しないでください。

関連する問題