如何使用在Tomcat服务器中运行的JavaEE应用程序从文件夹中检索图像?

时间:2017-11-29 09:32:24

标签: java tomcat servlets

我有以下疑问。我有一个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 类来完成这项工作?我该怎么办?

2 个答案:

答案 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。

使用:

  

youraddress.xxx/ 图片 /filename.png

这很重要 的 @WebServlet( “/图片/ *”)

它将自动转到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());
    }

}