我的图像servlet出现了奇怪的情况。它适用于Eclipse内部Web浏览器,但不能与FireFox,InternetExplorer,Chrome,Opera一起使用....
Servlet代码(如下)
protected void doPost(HttpServletRequest request,HttpServletResponse response)抛出ServletException,IOException {
File fl=new File("C:\\Documents and Settings\\Administrator\\My Documents\\Eclipse\\zadatak\\WebContent\\WEB-INF\\upload\\"); PrintWriter pw=response.getWriter(); response.setContentType("text/html"); pw.println("<html>"); pw.println("<head>"); pw.println("<style type=\"text/css\">"); pw.println("img{display:block-inline;width:100px;height:100px;"); pw.println("</style>"); pw.println("</head>"); pw.println("<body>"); pw.println("<table border=\"1\">"); pw.println("<tr>"); for(File f:fl.listFiles()){ pw.println("<td>"); pw.println("<img src=\"" + f.getPath() + "\">"); pw.println("</td>"); } pw.println("</tr>"); pw.println("</table>"); pw.println("</body>"); pw.println("</html>");
}
在Eclipse中,内部Web浏览器如下所示(下图)
PrintScreen of Eclipse internal web browser
最后我找到了解决问题的方法。谢谢大家的帮助!
现在,此代码有效!
ServletContext context=request.getServletContext(); String path=context.getRealPath("upload"); File fl=new File(path); PrintWriter pw=response.getWriter(); response.setContentType("text/html"); pw.println("<html>"); pw.println("<head>"); pw.println("<style type=\"text/css\">"); pw.println("img{display:block-inline;width:100px;height:100px;"); pw.println("</style>"); pw.println("</head>"); pw.println("<body>"); pw.println("<table border=\"1\">"); pw.println("<tr>"); LinkedHashMap<Integer, String> hm=new LinkedHashMap<Integer,String>(); int imageIndex=-1; for(File f:fl.listFiles()) { if(f.getName()!=null){ if(f.getName().endsWith(".bmp")) hm.put(++imageIndex, f.getName()); } } Iterator<String> pic=hm.values().iterator(); while(pic.hasNext()){ pw.println("<img src=\"upload/" + pic.next() + "\"/>"); } pw.println("</tr>"); pw.println("</table>"); pw.println("</body>"); pw.println("</html>");
我的项目中的类层次结构看起来像
MyWebProject
|-- src
| :
|
|-- web
| |-- META-INF
| | `-- MANIFEST.MF
| |-- WEB-INF
| | `-- web.xml
|-- upload (the place where I keep pictures)
:
Firefox现在可以正确显示图片
答案 0 :(得分:3)
想想你在做什么。有一台服务器,它的磁盘上有图像。还有一个浏览器,可以在不同的机器上运行,可能距离服务器几十英里。
您的servlet将以下内容发送到浏览器:
<img src="C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\someIage.jpg"/>
仅在
时才有效file://...
)C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\
的文件夹你应该明白,这不可行。
您需要的是一个servlet,它从服务器上的文件加载图像,并将此文件的内容发送到HTTP servlet响应(并且不要忘记设置正确的内容类型)。
一旦你有了这样一个servlet(让我们假设它被映射到URL /image
并将图像的ID作为参数),你已经拥有的servlet应该生成以下代码:
for (String id: idsOfTheImageToDisplay){
pw.println("<td>");
pw.println("<img src=\"/image?" + id + "\"/>");
pw.println("</td>");
}
此外,BMP不是一个很好的网络格式,因为它没有被压缩,因此消耗了大量的带宽。例如,您应该将图像转换为JPEG文件。