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 浏览器中有效吗?的主要内容,如果未能解决你的问题,请参考以下文章