如何在不使用Java zip utils的情况下访问压缩war文件中的文件?

时间:2013-12-12 12:11:13

标签: java file

我们在应用服务器中部署了.war文件。我们需要访问.war文件中的徽标图像,例如


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

在我们的应用程序中,我们保留一个属性文件,该文件位于此图像位置,以便加载它:

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

工作正常。

问题

现在我们将test.war更改为压缩(zipped)格式,我们当前的实现无法加载它。我们的目的是在不改变当前实现的情况下加载图像。这意味着我们可以通过更改图像来解决它属性文件中的路径?(我知道我们可以使用zip utils访问java中的压缩文件,遗憾的是我们无法更改代码) 我们试过了

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

并没有奏效。有希望吗?

1 个答案:

答案 0 :(得分: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。在某些Java服务器上可能会拒绝访问WAR内的文件。