我有以下疑问。我有一个TomCat服务器实例,我需要在Internet上公开一些JPG图像。在过去,我总是完成这种类型的任务安装Apache服务器,然后将我的图像放入 htdocs 子文件夹。使用 Tomcat 服务器似乎更复杂。
我在SO上发现了这篇文章:How to config Tomcat to serve images from an external folder outside webapps?
但我不确定我要做什么,所以我想问你一些问题,以澄清我的怀疑。
据我所知,JavaEE应用程序是这样的,部署,添加了应用程序服务器\ servlet容器的功能(不同于Apache,其中PHP应用程序只是运行的东西)。
因此,在发布链接示例的推理中,我认为:
我必须创建一个全新的JavaEE应用程序,该应用程序将部署到我的Tomcat服务器中。
此应用程序不包含任何类,因为没有必须实现的逻辑。
此应用程序只需要包含 web.xml 配置文件,该文件将配置一个映射到包含我的图像的目录的servlet,这个:
图片 com.example.images.ImageServlet 图片 /图片/*
我的怀疑是:上一个例子是不完整的吗?我是否要编写 ImageServlet 类来完成这项工作?我该怎么办?
答案 0 :(得分:1)
Tomcat有一个非常有趣的功能,即虚拟目录,你可以稍后在容器的文档中搜索,这就是我第一次在第6版中学到的东西(这个配置对所有版本都有效,我在8.0中使用.15),使用非常简单:
让我们假设您要映射到的目录是:C:\images\
为此,请创建一个名为应用程序名称的文件#yourApplication.xml,将此文件放入:C:\tools\apache-tomcat-8.0.15.0\conf\Catalina\localhost
。
该文件包含什么内容?
docBase:图像文件夹的实际路径。
路径:映射到您的应用程序,如何在可视化中保存和使用它,想象它可以是/images
或您选择的其他名称。
文件内容示例
https://tomcat.apache.org/tomcat-8.0-doc/virtual-hosting-howto.html#context.xml_-_approach__1
https://gist.github.com/dilnei/4c9b5ad8865b8c045f7b#file-espaco-brasil-imagens-xml
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" docBase="C:\images" path="/imagens" />
因此,如果在启动tomcat时正确设置,则应将虚拟目录映射到容器,并且无需编写任何代码行即可查看图像,只需访问浏览器并访问
即可。http://localhost:8080/images
我希望我帮助过你。
答案 1 :(得分:1)
HttpServlet将完美地满足您的需求。如果需要,您可以定义更多servlet。
使用:
这很重要 的 @WebServlet( “/图片/ *”)强>youraddress.xxx/ 图片强> /filename.png
它将自动转到PATH中定义的文件夹,并根据名称检索图像。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {
public static final String PATH = "C:/"
/*
linux
public static final String PATH = "/home/images/"
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getPathInfo().substring(1);
File file = new File(PATH,filename);
response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length",String.valueOf(file.length()));
response.setHeader("Content-Disposition","inline; filename=\""+filename +"\"");
Files.copy(file.toPath(),response.getOutputStream());
}
}