2014-09-13 56 views
1

我的問題是,我無法獲得非文本文件在瀏覽器中正確顯示。在我的服務器代碼中,我使用while循環來偵聽請求。當請求進入時,我將標題讀入變量headers。之後,我檢查請求是否是GET請求。如果是,那麼我檢查文件是否存在,並且它是文件而不是目錄。然後,我查看文件的擴展名,以確定HTTP響應中的下一行。家庭Java Java HTTP服務器沒有正確地提供非文本文件

pw.print("HTTP/1.1 Status: 200 OK\r\n"); 
String ext = file.getName().substring(file.getName().lastIndexOf('.') + 1, file.getName().length()); 
if(ext.equals("txt")) 
{ 
    pw.print("Content-Type: text/plain\r\n\r\n"); 
} 
else if(ext.equals("html")) 
{ 
    pw.print("Content-Type: text/html\r\n\r\n"); 
} 
else if(ext.equals("jpg")) 
{ 
    pw.print("Content-Type: image/jpeg\r\n\r\n"); 
} 
else if(ext.equals("png")) 
{ 
    pw.print("Content-Type: image/png\r\n\r\n"); 
} 
else if(ext.equals("pdf")) 
{ 
    pw.print("Content-Type: application/pdf\r\n\r\n"); 
} 

if(!ext.equals("txt") && !ext.equals("html")) 
{ 
    ImageInputStream imageStream = ImageIO.createImageInputStream(file); 
    BufferedImage bufferedImage = ImageIO.read(file); 
    ImageIO.write(bufferedImage, ext, socket.getOutputStream()); 
} 

現在,據我知道,一旦我進入最後的條件(我請求localhost:port/my_png.png)則內容應寫入插座和,因爲我告訴它什麼它Content-Type應該是,在瀏覽器應該能夠解釋該文件。不幸的是,這並沒有發生。我在瀏覽器中獲取字節輸出的文本。我的輸出看起來像這樣:

‰PNG 
��� 
IHDR���i���`���‘ïË¥��%IDATxÚíœ=h#×úÆ]ÜBE 

有誰知道我爲什麼會遇到這個問題?

+0

我不知道這是問題的原因,但不應該有一個內容長度? – ThePerson 2014-09-13 20:16:49

+1

我也建議在這裏尋找獲取內容類型,而不是有很多if-else ifs:http://stackoverflow.com/questions/51438/getting-a-files-mime-type-in​​-java – ThePerson 2014-09-13 20:18:26

+0

Your代碼不足以說明問題的確切位置,但可能會出現一個錯誤:是否將套接字連接到瀏覽器?如果是這樣,那麼看起來你並沒有在正文之前寫頭文件。你可以發佈更多的代碼嗎? – morgano 2014-09-13 20:34:02

回答

0

@morgano:是的,在我寫信給socket之前,我需要pw.flush()。非常感謝。

相關問題