簡體   English   中英

構建HTTP響應頭

[英]Building an HTTP Response Header

嘗試從頭開始構建Web服務器。 它適用於html和其他純文本文件。 在Firefox和Chrome中進行了測試。 但是我很難使圖像正確顯示。 返回狀態200,在Firefox中,我可以根據要求獲取附件圖像。 除了響應頭之外,我是否需要使用printstream來不同地處理圖像文件類型?

在此處輸入圖片說明

FileInputStream fileIn = new FileInputStream("test/" +
                file);

// split specified file path
String[] pathTokens = tokens[1].split("/|\\.");
String fileExt = pathTokens[tokens.length - 1];

// build response
out.println("HTTP/1.1 200 OK");
if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") || 
   fileExt.equals("ico"))
  out.println("Content type: image/" + fileExt);
else
  out.print("Content type: text/");
if(fileExt.equals("html"))
  out.println(fileExt);
else
  out.println("plain");

long size = fileIn.getChannel().size();

out.println("Content-Length: " + Long.toString(size));
out.println("Connect: Close");
out.println("");

int read = 0;
byte[] buffer = new byte[1024];

while ((read = fileIn.read(buffer)) != -1){
  out.write(buffer, 0, read);
}

如果需要任何其他信息,請提出要求。 我非常願意提供任何其他詳細信息,或盡可能回答任何問題。

編輯:經過進一步檢查,我實際上是在Firefox中獲取404,但我不太確定Chrome是什么,顯示的頁面是“無法訪問此站點...”,但看來我要返回200。

我想我可以看到一個錯誤:

if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") || 
   fileExt.equals("ico"))
  out.println("Content type: image/" + fileExt);
else
  out.print("Content type: text/");
if(fileExt.equals("html"))
  out.println(fileExt);
else
  out.println("plain");

如果我重新縮進並在Java編譯器認為應該的位置插入{}。

if (fileExt.equals("jpg") || fileExt.equals("jpeg") || 
    fileExt.equals("png") || fileExt.equals("ico")) {
    out.println("Content type: image/" + fileExt);
} else {
    out.print("Content type: text/");
}
if (fileExt.equals("html")) {
    out.println(fileExt);
} else {
    out.println("plain");
}

看到問題了嗎? 如果擴展名是(例如)“ jpg”,則將在標題中添加一條虛假的“普通”行。

我認為您實際上是想寫這樣的:

if (fileExt.equals("jpg") || fileExt.equals("jpeg") || 
    fileExt.equals("png") || fileExt.equals("ico")) {
    out.println("Content type: image/" + fileExt);
} else {
    out.print("Content type: text/");
    if (fileExt.equals("html")) {
        out.println(fileExt);
    } else {
        out.println("plain");
    }
}

這說明了:

  1. 使代碼的縮進與代碼實際所說的相匹配的重要性。 (提示:使用IDE的自動縮進功能!)
  2. 您應該養成始終對所有控件構造使用大括號塊的習慣。
  3. 重新發明輪子不是一個好主意。 除非您喜歡修理損壞的車輪。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM