0

我的图像 servlet 出现了奇怪的情况。它适用于 Eclipse 内部网络浏览器,但不适用于 FireFox、InternetExplorer、Chrome、Opera....

Servlet 代码(下)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws 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 内部网络浏览器中看起来像这样(下)

Eclipse 内部 Web 浏览器的 PrintScreen

最后我找到了解决我的问题的方法。谢谢大家帮助我!

现在,此代码有效!

  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 正确显示页面

4

1 回答 1

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 对 web 来说不是一种好的格式,因为它没有被压缩,因此会消耗大量带宽。例如,您应该将图像转换为 JPEG 文件。

于 2013-08-12T14:46:15.000 回答