2012-05-14 15 views
1

我有以下問題:在java動態web項目中找不到圖像

我創建了應繪製動態圖形的servlet。在繪圖過程中,它應該從另一個目錄中獲取圖片並將其繪製在另一個圖片上。一切都應該很好地工作:

try { 
      BufferedImage temp = ImageIO.read(new File("image/arrow.png")); 
      tempIm = temp.getScaledInstance(55, 55, Image.SCALE_SMOOTH); 
     } catch (IOException e) { 

      e.printStackTrace(); 

     } 

但它打印如下:

SEVERE: javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(ImageIO.java:1275) at CertificateDraw.doGet(CertificateDraw.java:36)

我試圖改變所有可能的方式File對象的路徑,它只是給了即使同樣的問題圖像的一部分仍然發送到瀏覽器。所以問題出在ImageIO.read部分 - 我怎麼才能找到它爲什麼不加載圖像?!

我在Eclipse中工作 - servlet位於src文件夾中。該圖像位於rot目錄「WebContent」下的「image」文件夾中。

回答

1

java.io.File中的相對路徑與當前工作目錄(CWD)有關。這是當給出命令啓動Java運行時環境(在你的情況下,Web服務器)時當前打開的文件夾。在Eclipse中啓動服務器時,通常是項目的/bin文件夾。你可以通過打印new File(".").getAbsolutePath()來確定。

但是,你不應該依賴File中的相對路徑。 CWD不能從代碼內部控制。

因爲它已經在webcontent文件夾中,所以請改爲ServletContext#getResourceAsStream()

InputStream input = getServletContext().getResourceAsStream("/image/arrow.png"); 
BufferedImage image = ImageIO.read(input); 
// ... 

注意,getServletContext()GenericServlet類的HttpServlet從擴展繼承,這樣你就不需要自己提供方法。

+0

非常感謝!它工作完美。 –

+0

不客氣:) – BalusC

+0

但你能解釋更多關於這個概念嗎?什麼是CWD?不應該是在Web服務器中部署的文件? servlet只在被調用時處理請求 - 這意味着File類在部署之前正在尋找資源? + getResource()如何找到相同的資源?我是否也應該對所有類型的碎片做同樣的事情 - 不僅僅是悽美? - jsp片段怎麼樣 - 如果它們不是直接在根目錄下,而是在一些子文件夾中,它們如何加載? –