2013-12-12 26 views
0

我們在應用程序服務器中部署了一個.war文件。我們需要訪問一個標誌形象,.war文件裏面,像如何在不使用Java zip utils的情況下訪問壓縮war文件中的文件?


    test.war 
     |_ skin/ 
       |_ logo.gif 

而且在我們的應用中保持其poins到該圖像位置的屬性文件,以加載:

imagepath = D:/server/.../test.war/skin/logo.gif 

它工作正常。

問題

現在我們改變了我們的test.war到壓縮(zipped)格式,而我們當前的實現無法加載it.Our意圖是加載圖像而無需改變當前implementation.That裝置能夠我們解決它僅通過更改屬性的圖像文件的路徑?(我知道我們可以用拉鍊utils的存取權限在java中的壓縮文件,遺憾的是我們無法改變的代碼) 我們試圖

,並沒有工作。有希望嗎?

+0

不打開戰爭是不可能的。但通常情況下,一旦部署你的戰爭已經爆炸在'webapps'文件夾(或類似的東西)。然後你應該找到你的形象。 – YMomb

+0

我們使用Jboss作爲7.我沒有發現戰爭文件的任何爆炸文件夾結構。我注意到在tomcat中的東西,它會工作,你說 –

+0

也許你可以按照[這裏] [1]的解釋首先爆炸你的戰爭。 [1]:http://stackoverflow.com/questions/487363/how-can-i-get-jboss-to-explode-a-deployed-war-file – YMomb

回答

0

這裏是代碼(Servlet的getMethod),這將下載web.xml和拉鍊它。我認爲它會很容易爲您的目的進行轉換:只需刪除zip流。

主要的竅門是getRealPath。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     try { 
      final String docxzip = "zip"; 

      // vzemi datoteko iz web xml 
      String webXMLFile = getServletContext().getRealPath("/WEB-INF/web.xml"); 

      response.setContentType("application/zip"); 
      response.setHeader("Content-Disposition","inline; filename=output.zip;"); 

      ServletOutputStream outputStream = response.getOutputStream(); 
      ZipOutputStream zip = new ZipOutputStream(outputStream); 
      zip.putNextEntry(new ZipEntry("web.xml")); 

      byte[] b = new byte[1024]; 
      int len; 
      FileInputStream fis = new FileInputStream(webXMLFile); 
      while ((len = fis.read(b)) != -1) { 
       zip.write(b, 0, len); 
      } 
      //response.setHeader("Content-Length", (new Integer(len)).toString()); 
      fis.close(); 
      zip.flush(); 
      zip.close(); 
      outputStream.flush(); 
      final PrintWriter out = response.getWriter(); 
      out.print(docxzip); 
      out.flush(); 
      return; 
     } catch (Exception ex) { 
      HttpUtils.noData(response, ex.toString()); 
      return; 
     } 
    } 

P.S.在WAR內部訪問文件可能會在某些Java服務器上被拒絕。

相關問題