2012-05-09 55 views
2

我使用Java,JSP和Jetty開發網站。以JSP中的絕對路徑顯示圖像

我在通過<img>標籤的src中傳遞的圖像路徑出現問題。

在我的數據庫中,我擁有Linux用戶映像的絕對路徑。我得到這個值並放入「src」屬性。

我有路徑,例如:

  • /home/website/images/image1.png

製作這種方式,圖像不會出現。 思考了很長一段時間,我斷定這很自然,因爲我從來沒有在任何網站圖像中看到這樣的路徑到達操作系統的絕對路徑。

我需要知道的是我必須做什麼?

我必須改變Jetty的配置嗎? 我是否必須在Java中運行一些代碼?

通過谷歌搜索,我變得更加困惑。我想要一個解釋。


UPDATE(26/03/2013)

我發現處理這個問題是這樣的:

http://balusc.blogspot.com.br/2007/04/imageservlet.html

謝謝BalusC! hauhauhahaua

回答

0

根據您在URI中使用的詞語來判斷,看起來您將文件系統中的文件路徑放在src屬性中,而不是用於唯一標識資源的URL。

絕對路徑並非絕對來自您的文件系統,它們絕對來自Web服務器的根目錄。此外,甚至可以更改或修改這些URL資源標識符以映射到服務器中的不同文件夾,甚至是動態資源。

下面是一個例子:

路徑上的服務器文件:

/home/website/images/image1.png 

example.com被映射爲 「網站」 文件夾:

當使用相對URL ,也許你會看到:

<img src="/images/image1.png" /> 

要使用絕對URL,你需要的HTTP方案:

<img src="http://example.com/images/image1.png" /> 

總之,使用文件路徑來識別從客戶端HTML您的服務器上的資源只是不正確的,將無法正常工作。

2

事實上,<img src>必須引用公共網頁URL,而不是本地磁盤文件系統路徑。您的圖片必須通過HTTP請求提供。這就是網頁瀏覽器必須下載它們,而不是必須以某種方式包含它們的網絡服務器。

對於初學者來說,最簡單的方法是創建一個servlet它獲取的圖像內容由FileInputStreamInputStream基於請求參數或路徑信息,然後將它寫入通常的Java IO方式向HttpServletResponseOutputStream,後已經設置了必要的HTTP響應頭文件,以便瀏覽器理解如何處理它。

例如,假設該servlet被映射在/images/*並打開圖像http://example.com/contextpath/images/image1.png

String filename = request.getPathInfo(); 
File file = new File("/home/website/images", filename); 

response.setHeader("Content-Type", getServletContext().getMimeType(filename)); 
response.setHeader("Content-Length", String.valueOf(file.length())); 

InputStream input = new FileInputStream(file); 
OutputStream output = response.getOutputStream(); 
// Stream bytes the usual way. 

另一種方法是作爲一個新的Web應用程序上下文添加/home/website/images到服務器的/images上下文路徑。通過這種方式,圖像可以通過http://example.com/images/image1.png獲得。您只依賴於servletcontainer make/version如何配置以及您是否完全控制它。對於碼頭,這將是下面的,如果你編程的IT管理:

server.setHandler(new WebAppContext("/home/webapp/images", "/images")); 

或者當你通過XML管理IT:

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="resourceBase">/home/website/images</Set> 
    <Set name="contextPath">/images</Set> 
</Configure> 
+0

好極了! 關於第一種解決方案,假如我的圖像太多,會不會是某種效率不高? 關於我更喜歡​​的2º解決方案,我將在哪裏設置新的WebAppContext?我可以在xml文件中做到這一點嗎? 非常感謝! =] –

+0

我已經把相同的代碼放在context.xml中,就像你提到的一樣,但它沒有工作......你確定嗎? –

+0

對不起,''必須是''。至於第一種解決方案的效率,對於流式傳輸來說並不差,但它並不考慮瀏覽器緩存請求。 – BalusC