2009-07-14 28 views
0

我有Java webserver(沒有標準軟件...自寫)。一切似乎工作正常,但當我嘗試調用包含圖片的頁面時,這些圖片不會顯示。我是否必須將圖像與輸出流一起發送到客戶端?我錯過了一個額外的步驟?當網站從自己寫的網絡服務器調用時沒有顯示圖像

由於有太多的代碼,它張貼在這裏,這裏是一個小的輪廓會發生什麼或應該發生:

1. client logs in 
2. client gets a session id and so on 
3. the client is connected with an output stream 
4. we built the response with the HTML-Code for a certain 'GET'-request 
5. look what the GET-request is all about 
6. send html response || file || image (not working yet) 

這麼多的基本輪廓...

它發送css文件和東西,但我仍然有一個圖像的問題! 有沒有人有想法?如何將圖像從服務器發送到瀏覽器? 謝謝。

我使用charles檢查來自客戶端的請求和來自服務器的響應。它發送的文件(如css或js)很好,但不與圖像:雖然狀態是「200 OK」,傳輸編碼是chunked ...我不知道這意味着什麼!?有人知道嗎?

編輯: 這裏是文件讀取代碼:

try{ 
     File requestedFile = new File(file); 
     PrintStream out = new PrintStream(this.getHttpExchange().getResponseBody()); 
     // File wird geschickt: 
     InputStream in = new FileInputStream(requestedFile); 
     byte content[] = new byte[(int)requestedFile.length()]; 
     in.read(content); 

     try{ 
      // some header stuff 
      out.write(content); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

     in.close(); 

     if(out!=null){ 
      out.close(); 
      System.out.println("FILE " + uri + " SEND!"); 
     } 
} 
catch (/*all exceptions*/) { 
     // catch it ... 
} 
+0

全部大寫,真的嗎? – Tim 2009-07-14 07:20:45

+0

響應包含什麼? – cjk 2009-07-14 07:23:21

+0

@ck:響應是html頁面作爲字符串...它通過輸出流發送回客戶端 @Tim:呵呵? – doro 2009-07-14 07:32:44

回答

1

我必須把那些外部文件 或圖像與輸出流 客戶端?

客戶端將爲您的服務器必須提供的這些文件提出單獨請求。但是,這些請求可以通過相同的persisten connection(也稱爲keepalive)來到達。您的問題的兩個最可能的原因:

  1. 客戶端嘗試通過持久連接發送多個請求(這是HTTP 1.1的默認連接),並且您的服務器不能正確處理此問題。避免這種情況的最簡單方法是發送一個Connection: close標題和響應。
  2. 客戶端嘗試打開單獨的連接,並且服務器未正確處理它。

編輯:

有此線的一個問題:

in.read(content); 

這種方法不能保證填充陣列;它將讀取任意數量的字節並返回該數字。你必須在循環中使用它,以確保讀取所有內容。既然你必須做一個循環,最好使用一個較小的數組作爲緩衝區,以避免將整個文件保存在內存中,並運行到帶有大文件的OutOfMemoryError中。

3

您的瀏覽器將單獨GET image.png HTTP 1.1請求發送到您的服務器,你應該處理這些文件變得太。沒有好的方法來在HTML中嵌入和獨立於瀏覽器的圖像,在某些瀏覽器中只有<img src="data:base64codedimage">協議處理程序可用。

當您創建HTML響應時,可以將外部js/css文件的內容直接包含在<script></script><style></style>標籤之間。

編輯:我建議使用Firebug進一步診斷。

1

Proabably步驟#4你要去哪裏錯了:

// 4. we built the response with the HTML-Code for a certain 'GET'-request 

一些請求將是一個 'GET /css/styles.css' 或 'GET /js/main.js' 或' GET /images/header.jpg'。確保你在這些情況下流式傳輸這些文件 - 直接加載這些URL。

1

瀏覽器將圖像(和css/js文件)作爲完全獨立的GET請求發送到頁面,所以絕對不需要「將那些...與輸出流一起發送」。所以如果你的頁面服務正常,但圖像沒有被加載,我的第一個猜測是你沒有適當地設置你的響應頭(例如,設置Content-Type的響應text/html),所以瀏覽器不會將其解釋爲適當的頁面,因此不加載圖像。

一些其他的東西來嘗試,如果不工作:

  • 檢查您是否可以訪問圖像直接
  • 使用類似螢火蟲或招潮蟹檢查瀏覽器是否實際上是請求圖像/ css/js文件&您的所有請求/響應標題看起來不錯
  • 使用existing web server
相關問題