Image Servlet不想在浏览器中显示图像(FireFox,IE ..)但是在Eclipse浏览器中工作?

时间:2013-08-12 13:08:55

标签: servlets

我的图像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现在可以正确显示图片

Firefox correctly shows page

1 个答案:

答案 0 :(得分:3)

想想你在做什么。有一台服务器,它的磁盘上有图像。还有一个浏览器,可以在不同的机器上运行,可能距离服务器几十英里。

您的servlet将以下内容发送到浏览器:

<img src="C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\someIage.jpg"/>

仅在

时才有效
  • 浏览器接受从文件系统加载图像,尽管HTML页面加载了HTTP
  • 浏览器接受从文件系统加载文件,尽管URL不正确(应该是file://...
  • 客户端在Windows上运行
  • 用户碰巧在他的机器上有一个名为C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\的文件夹
  • 此文件夹恰好已包含servlet发送的所有图像

你应该明白,这不可行。

您需要的是一个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文件。