我们在应用服务器中部署了.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
并没有奏效。有希望吗?
答案 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内的文件。