Image Servlet 不想在浏览器(FireFox、IE ..)中显示图像,但在 Eclipse 浏览器中有效吗?

Posted

技术标签:

【中文标题】Image Servlet 不想在浏览器(FireFox、IE ..)中显示图像,但在 Eclipse 浏览器中有效吗?【英文标题】:Image Servlet doesn't want to show image in browser (FireFox, IE..) but in Eclipse browser works? 【发布时间】:2013-08-13 19:33:32 【问题描述】:

我的图像 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("imgdisplay: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 内部网络浏览器中看起来像这样(下)

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("imgdisplay: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

【问题讨论】:

您似乎期望图像以某种方式内联在 HTML 输出中。这不是真的。图片是根据src 属性中的 URL 单独/单独请求和下载的。 顺便说一句,部署空间中有一个名为“upload”的文件夹也令人担忧。您不应该将上传的文件存储在部署文件夹中,原因很简单,一旦您重新部署 WAR,或者即使您只是重新启动服务器,它们都会丢失,而这又具有非常简单的原因,即新添加的文件不包含在原始 WAR 文件。总而言之,尽管我对您之前就相关问题提出的问题发表了评论,但您仍然完全走错了方向。 【参考方案1】:

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

您的 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 文件。

【讨论】:

并将 JSP 用于 HTML。 我同意你的观点,*.bmp 格式不适合网络。我使用 *.bmp 仅用于测试项目(真实图片为 *.jpg 格式)。三个月前开始学习Java,对java-ee编程没有太多经验。非常感谢您的回复! 您创建/面临的问题并不完全是 Java/Java EE 特定的。只是基本的 Web 开发(HTTP、HTML 和朋友)。除了基本的 Java 之外,强烈建议在深入研究 Servlet 之前具备良好的 HTTP/HTML 知识,因为它们在这个问题的上下文中基本上只是 HTTP 请求侦听器和 HTML 代码生成器。

以上是关于Image Servlet 不想在浏览器(FireFox、IE ..)中显示图像,但在 Eclipse 浏览器中有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

fire fox 浏览器看不了视频,怎么调?

fire fox 浏览器看不了视频,怎么调?

ASP.NET WebApi 中的 Fire-forget 和单向调用

如何设置servlet中并发请求数的限制?

Kindle Fire Silk 浏览器阅读视图 CSS

报头的HTTP报头学习