服务器启动后,Tomcat无法从上下文路径加载新图像

马特乌斯·维卡里(Mateus Viccari)

server.xml我的tomcat文件夹中,我在<Host>标记下有一个虚拟文件夹

<Context docBase="C:\app_files\" path="/app_files"/>

因此,我可以通过url从此文件夹中访问文件:http:// localhost:8080 / app_files / some_file.jpg

但这仅在启动服务器之前图像或文件已经存在的情况下才有效。如果我转到指向服务器启动后创建的图像的URL,则会出现404错误。重新启动服务器后,映像将正确加载。

如何解决这个问题?

马特乌斯·维卡里(Mateus Viccari)

实际上,在不使用server.xml的上下文的情况下,我确实设法完成了所需的操作。它基于BalusC的解决方案来通过servlet提供静态文件,方法如下:

  • 首先,我在系统中创建了一个环境变量(可以在每个操作系统中完成,只需在google上找到“如何在Windows,Linux等系统上创建环境变量”),称为MANAGEMENT_FILES,在我的情况下,变量值为c:/ management_files /
  • 然后,在创建应显示给用户的图像的方法上,我将图像保存在此文件夹中(这是上一步中环境变量的值)

public String imageUrl;

public void createAndShowImage() {
    try {
        String imageName = "/nice_images_folder/cool_image.jpg";
        File imageFile = new File(System.getenv("MANAGEMENT_FILES") + imageName);
        //Here goes your logic to create the file
        createImage(imageFile);
        //Here i use a fixed URL, you can do it as you see fit
        this.imageUrl = "http://localhost:8080/MyCoolApp/" + CoolFileServlet.BASE_URL + imageName + "?delete=true";
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 这是您必须创建的servlet,此servlet返回图像或放置在文件夹中的任何其他文件:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="CoolFileServlet", urlPatterns={CoolFileServlet.BASE_URL + "*"})
public class CoolFileServlet extends HttpServlet {

    public static final String BASE_URL = "/shiny_happy_files/";

    private static final int DEFAULT_BUFFER_SIZE = 10240;

    private String filePath;

    public void init() throws ServletException {
        this.filePath = System.getenv("MANAGEMENT_FILES");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        String requestedFile = request.getPathInfo();

        if (requestedFile == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        File file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));

        if (!file.exists()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        String contentType = getServletContext().getMimeType(file.getName());
        if (contentType == null) {
            contentType = "application/octet-stream";
        }

        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");

        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            close(output);
            close(input);
            try {
                if ("true".equals(request.getParameter("delete"))) {
                    if (!file.delete()) {
                        throw new RuntimeException("File could not be deleted");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

请注意,您可以在访问URL时将其参数delete = true传递给url,以便在恢复后立即将其删除(以防万一不再需要它)。

在我的情况下,我需要在用户执行某些操作后在页面上显示图像,所以我要做的就是显示图像url:

<h:graphicImage url="#{myManagedBean.imageUrl}"/>

就是这样,您可以使用此servlet提供任何类型的文件,并且该文件将立即返回您想要的文件,并且该文件将在服务器重新启动/重新部署之间保持活动状态(如果未通过删除)delete=true

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试所有上下文 docBase 配置后,无法在 jsp 中显示保存在 tomcat 服务器上的静态图像

来自分类Dev

无法在Web服务器上启动调试。该地址对此上下文无效

来自分类Dev

Tomcat 应用程序 404 无法加载 - 上下文路径中的应用程序无法启动

来自分类Dev

将MVC应用程序发布到Web服务器后无法生成SSPI上下文异常

来自分类Dev

无法从上下文访问请求

来自分类Dev

Create-react-app:如何定义开发服务器的上下文路径

来自分类Dev

h:graphicimage值属性:如何获取服务器路径而不是Webapp上下文根

来自分类Dev

Intellij 中 Tomcat 服务器的自动“应用程序上下文”

来自分类Dev

在tomcat上部署后未加载Spring上下文

来自分类Dev

Tomcat 8.5 上下文路径无法正常工作

来自分类Dev

失败-上下文路径中已部署的应用程序/但上下文无法启动

来自分类Dev

如何设置Angular 2和Webpack项目以从上下文路径检索图像?

来自分类Dev

无法使用Maven筛选应用程序上下文从Eclipse运行服务器

来自分类Dev

PowerShell Get-ADUser“无效的枚举上下文”和“无法联系服务器”错误

来自分类Dev

从Solaris服务器安装的文件的SELinux上下文

来自分类Dev

Tomcat上的Geoserver-失败-上下文路径/ geoserver上的应用程序无法启动。[WEB-INF]无效

来自分类Dev

从上下文菜单中打开后无法最大化cygwin

来自分类Dev

Spring Eureka服务器在客户端URL中找不到上下文路径

来自分类Dev

如何为同一域但上下文路径不同的2个不同的Web /应用服务器?

来自分类Dev

如何为同一域但上下文路径不同的2个不同的Web /应用服务器?

来自分类Dev

实体框架从上下文重新加载实体

来自分类Dev

应用程序上下文是否始终需要将war文件加载到服务器上

来自分类Dev

Tomcat服务器无法启动

来自分类Dev

无法加载Tomcat服务器配置

来自分类Dev

无法从上下文对象继承吗?

来自分类Dev

Swift无法从上下文推断类型

来自分类Dev

无法从上下文推导(简单)Typeclass

来自分类Dev

从上下文无法进行Serilog充实

来自分类Dev

无法从上下文中解构对象的属性

Related 相关文章

  1. 1

    尝试所有上下文 docBase 配置后,无法在 jsp 中显示保存在 tomcat 服务器上的静态图像

  2. 2

    无法在Web服务器上启动调试。该地址对此上下文无效

  3. 3

    Tomcat 应用程序 404 无法加载 - 上下文路径中的应用程序无法启动

  4. 4

    将MVC应用程序发布到Web服务器后无法生成SSPI上下文异常

  5. 5

    无法从上下文访问请求

  6. 6

    Create-react-app:如何定义开发服务器的上下文路径

  7. 7

    h:graphicimage值属性:如何获取服务器路径而不是Webapp上下文根

  8. 8

    Intellij 中 Tomcat 服务器的自动“应用程序上下文”

  9. 9

    在tomcat上部署后未加载Spring上下文

  10. 10

    Tomcat 8.5 上下文路径无法正常工作

  11. 11

    失败-上下文路径中已部署的应用程序/但上下文无法启动

  12. 12

    如何设置Angular 2和Webpack项目以从上下文路径检索图像?

  13. 13

    无法使用Maven筛选应用程序上下文从Eclipse运行服务器

  14. 14

    PowerShell Get-ADUser“无效的枚举上下文”和“无法联系服务器”错误

  15. 15

    从Solaris服务器安装的文件的SELinux上下文

  16. 16

    Tomcat上的Geoserver-失败-上下文路径/ geoserver上的应用程序无法启动。[WEB-INF]无效

  17. 17

    从上下文菜单中打开后无法最大化cygwin

  18. 18

    Spring Eureka服务器在客户端URL中找不到上下文路径

  19. 19

    如何为同一域但上下文路径不同的2个不同的Web /应用服务器?

  20. 20

    如何为同一域但上下文路径不同的2个不同的Web /应用服务器?

  21. 21

    实体框架从上下文重新加载实体

  22. 22

    应用程序上下文是否始终需要将war文件加载到服务器上

  23. 23

    Tomcat服务器无法启动

  24. 24

    无法加载Tomcat服务器配置

  25. 25

    无法从上下文对象继承吗?

  26. 26

    Swift无法从上下文推断类型

  27. 27

    无法从上下文推导(简单)Typeclass

  28. 28

    从上下文无法进行Serilog充实

  29. 29

    无法从上下文中解构对象的属性

热门标签

归档