gpt4 book ai didi

java - 如何从 Java Servlet 将文件中的图像输出为 HTML

转载 作者:行者123 更新时间:2023-11-30 02:59:14 25 4
gpt4 key购买 nike

我有一个 Servlet Starter.java,在其 doGet() 方法中我使用 PrinterWriter 对象来打印 HTML。

我有一个图像文件:C:/.../Entertainment_mgmt/src/images/logo.png (在我的项目中),我想显示一个从本地主机获取的 Servlet 页面,地址为 localhost:8084/Starter 。该页面还有其他 HTML 结构,我想保留这些结构(也就是说,我想将图像放在屏幕的一小部分中)。简单地输出<img src="C:/.../Entertainment_mgmt/src/images/logo.png" />到 HTML 似乎不起作用。

我没有执行任何手动 servlet 映射,也没有更改任何 Tomcat 的配置文件。

enter image description here

我查过很多类似的帖子,但我似乎无法掌握其中的窍门。

编辑:我看到这篇文章已被标记为重复。我觉得这篇文章仍然具有重要意义,因为其他程序员可能会犯与我相同的错误(关于 Tomcat 与页面一起提供图像)。此外,这提供了一个不需要更改 Tomcat 的解决方案 /conf/server.xml文件

最佳答案

好吧,我找到了答案。事实证明,要加载图像,您实际上需要 Java 代码通过 BufferedOutputStream 写出二进制数据(作为一个新手,我原以为 Tomcat 会为我处理这个问题)。

具体来说,您需要一个 servlet 来将 HTML 中的“/images/logo.jpg”等路径实际转换为可用的图像。通过/images/* 到 servlet 的 servlet 映射来调用 servlet。通过提取/images/* 的 * 部分,我们可以获得准确的图像名称,然后 servlet 可以加载它。

这是 servlet 映射(将添加到 WEB-INF/web.xml ):

...
<servlet>
<servlet-name>DisplayImage</servlet-name>
<servlet-class>servlets.DisplayImage</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>DisplayImage</servlet-name>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>
...

请注意,在我的项目中,DisplayImage 位于 C:/.../Entertainment_mgmt/src/servlets/DisplayImage.java 中.

当然,您可以在映射中添加任何您想要的内容。该映射是在 URL 中看到的,如 localhost:8040/images/logo.jpg 中所示。或在 HTML 页面内为 <img src="/images/logo.jpg" /> 。从 servlet 的角度来看,两者是同一件事。根据上面的映射,两者均由 servlet DisplayImage 处理。

我找到了一些 DisplayImage servlet 的代码 here 。我稍微修改了一下:

package servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class DisplayImage extends HttpServlet {
public final String imagesBase = "F:\\Workspaces\\Java\\Projects\\Entertainment_mgmt\\src\\images/";

public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
String URLAfterWebDomain = request.getRequestURI();

//Only accept mappings as src="/images/whatever.jpg", even if web.xml has other mappings to this servlet.
if(URLAfterWebDomain.startsWith("/images/") == false)
return;

//get the image name, or even directory and image, e.g. /images/music/beethoven.jpg:
String relativeImagePath = URLAfterWebDomain.substring("/images/".length()); //will get "music/beethoven.jpg"

System.out.println("\nFetching image from "+imagesBase+relativeImagePath);
response.setContentType("image/jpeg"); //as far as I know, this works for PNG as well. You might want to change the mapping to /images/*.jpg if it's giving problems

ServletOutputStream outStream;
outStream = response.getOutputStream();
FileInputStream fin = new FileInputStream(imagesBase+relativeImagePath);

BufferedInputStream bin = new BufferedInputStream(fin);
BufferedOutputStream bout = new BufferedOutputStream(outStream);
int ch =0; ;
while((ch=bin.read())!=-1)
bout.write(ch);

bin.close();
fin.close();
bout.close();
outStream.close();
}
}

您可以设置imagesBase到您计算机上的任何文件夹,它不必位于您的项目文件夹中。您还可以更改 /images/ 的名称文件夹到/pics/管他呢。

现在,每当我输入 <img> HTML 中的标签,我可以使用 src="/images/whatever.jpg"属性来调用 DisplayImage servlet 并显示图像。然后可以重新定位该图像等。

这甚至可以在其他写出 HTML 的 servlet 中完成。在这种情况下,Servlet 会被独立调用,并通过 HTTP 独立输出(这就是为什么在某些网页中,先加载文本,后加载图像)。

关于java - 如何从 Java Servlet 将文件中的图像输出为 HTML <img>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com