java spring 资源文件夹中的图像不可用(404 错误)
java spring images in resources folder not available (404 error)
我正在使用 Spring 4.1.5 版框架开发 Web 应用程序
我已正确配置和设置资源文件夹,并且已经从中加载 css、js 和图像文件。
<mvc:resources mapping="/images/**" location="/resources/" />
但是,我还使用资源文件夹将图像上传到其中并在前端显示它们。有一点我目前陷入困境并且没有继续我的理解。我收到 404 错误(资源不可用),而其他人则工作得很好。路径都正确,文件上传成功,我确定。
我也看到了相反的效果 - 重命名甚至从资源文件夹中删除资源不会影响它们通过 Web url 的可访问性。在构建应用程序期间,我没有将任何文件复制到另一个文件夹,因此我在资源文件夹中处理这些文件。我还在我的文件系统上查找了文件名,但它已经不存在了,所以我假设一定有一些缓存。
Spring是否在启动时在现有资源文件上建立索引或缓存?我是否必须在上传文件后刷新任何 ApplicationContext 以通知框架文件系统中的更改?如果是,我该怎么做?
希望有人能在这里帮助我:)
谢谢,
汤姆
编辑:
调用 URL 时,如:localhost:8080/EstelV2/images/testimage.jpg
我 运行 进入 404 资源不可用,即使 testimage.jpg 在文件系统上的正确文件夹结构中并获得日志输出:
2015-04-30 22:13:05,035 - [DEBUG] - [http-nio-8080-exec-4] (DispatcherServlet.java:845) - DispatcherServlet with name 'spring-dispatcher' processing GET request for [/EstelV2/images/testimage.jpg]
2015-04-30 22:13:05,035 - [DEBUG] - [http-nio-8080-exec-4] (AbstractHandlerMethodMapping.java:297) - Looking up handler method for path /images/testimage.jpg
2015-04-30 22:13:05,041 - [DEBUG] - [http-nio-8080-exec-4] (AbstractHandlerMethodMapping.java:305) - Did not find handler method for [/images/testimage.jpg]
2015-04-30 22:13:05,041 - [DEBUG] - [http-nio-8080-exec-4] (AbstractUrlHandlerMapping.java:168) - Matching patterns for request [/images/testimage.jpg] are [/images/**]
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (AbstractUrlHandlerMapping.java:193) - URI Template variables for request [/images/testimage.jpg] are {}
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (AbstractUrlHandlerMapping.java:123) - Mapping [/images/testimage.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/resources/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@280f257d]]] and 1 interceptor
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (DispatcherServlet.java:931) - Last-Modified value for [/EstelV2/images/testimage.jpg] is: -1
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (DispatcherServlet.java:1018) - Null ModelAndView returned to DispatcherServlet with name 'spring-dispatcher': assuming HandlerAdapter completed request handling
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (FrameworkServlet.java:996) - Successfully completed request
servlet 规范没有提到 WEB_INF 是文档根目录
在名为 WEB-INF 的应用程序层次结构中存在一个特殊目录。该目录包含与应用程序相关但不在应用程序文档根目录中的所有内容。 WEB-INF 节点不是应用程序 public 文档树的一部分。 WEB-INF 目录中包含的任何文件都不能由容器直接提供给客户端。但是,WEB-INF 目录的内容对于使用 ServletContext 上的 getResource 和 getResourceAsStream 方法调用的 servlet 代码是可见的,并且可以使用 RequestDispatcher 调用公开。所以只用它来保护您的内容,但对于图像,请将其放在网络路径中的其他文件夹中
经过几个小时的调查,我得出了一个结论:
我的问题与 spring 无关,这是我的 eclipse 项目的问题。看来,只要我不在 eclipse 中刷新我的项目,tomcat 服务器就无法访问新上传的文件——而旧文件已从文件系统中删除但仍在 eclipse 项目中一直可以访问。
我在首选项 -> 常规 -> 工作区 -> "Refresh using native hooks and polling" 和 "Refresh on access" 中打开了两个自动刷新选项,这暂时解决了我的问题。
感谢您的帮助!
我正在使用 Spring 4.1.5 版框架开发 Web 应用程序
我已正确配置和设置资源文件夹,并且已经从中加载 css、js 和图像文件。
<mvc:resources mapping="/images/**" location="/resources/" />
但是,我还使用资源文件夹将图像上传到其中并在前端显示它们。有一点我目前陷入困境并且没有继续我的理解。我收到 404 错误(资源不可用),而其他人则工作得很好。路径都正确,文件上传成功,我确定。
我也看到了相反的效果 - 重命名甚至从资源文件夹中删除资源不会影响它们通过 Web url 的可访问性。在构建应用程序期间,我没有将任何文件复制到另一个文件夹,因此我在资源文件夹中处理这些文件。我还在我的文件系统上查找了文件名,但它已经不存在了,所以我假设一定有一些缓存。
Spring是否在启动时在现有资源文件上建立索引或缓存?我是否必须在上传文件后刷新任何 ApplicationContext 以通知框架文件系统中的更改?如果是,我该怎么做?
希望有人能在这里帮助我:)
谢谢, 汤姆
编辑: 调用 URL 时,如:localhost:8080/EstelV2/images/testimage.jpg
我 运行 进入 404 资源不可用,即使 testimage.jpg 在文件系统上的正确文件夹结构中并获得日志输出:
2015-04-30 22:13:05,035 - [DEBUG] - [http-nio-8080-exec-4] (DispatcherServlet.java:845) - DispatcherServlet with name 'spring-dispatcher' processing GET request for [/EstelV2/images/testimage.jpg]
2015-04-30 22:13:05,035 - [DEBUG] - [http-nio-8080-exec-4] (AbstractHandlerMethodMapping.java:297) - Looking up handler method for path /images/testimage.jpg
2015-04-30 22:13:05,041 - [DEBUG] - [http-nio-8080-exec-4] (AbstractHandlerMethodMapping.java:305) - Did not find handler method for [/images/testimage.jpg]
2015-04-30 22:13:05,041 - [DEBUG] - [http-nio-8080-exec-4] (AbstractUrlHandlerMapping.java:168) - Matching patterns for request [/images/testimage.jpg] are [/images/**]
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (AbstractUrlHandlerMapping.java:193) - URI Template variables for request [/images/testimage.jpg] are {}
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (AbstractUrlHandlerMapping.java:123) - Mapping [/images/testimage.jpg] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/resources/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@280f257d]]] and 1 interceptor
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (DispatcherServlet.java:931) - Last-Modified value for [/EstelV2/images/testimage.jpg] is: -1
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (DispatcherServlet.java:1018) - Null ModelAndView returned to DispatcherServlet with name 'spring-dispatcher': assuming HandlerAdapter completed request handling
2015-04-30 22:13:05,042 - [DEBUG] - [http-nio-8080-exec-4] (FrameworkServlet.java:996) - Successfully completed request
servlet 规范没有提到 WEB_INF 是文档根目录 在名为 WEB-INF 的应用程序层次结构中存在一个特殊目录。该目录包含与应用程序相关但不在应用程序文档根目录中的所有内容。 WEB-INF 节点不是应用程序 public 文档树的一部分。 WEB-INF 目录中包含的任何文件都不能由容器直接提供给客户端。但是,WEB-INF 目录的内容对于使用 ServletContext 上的 getResource 和 getResourceAsStream 方法调用的 servlet 代码是可见的,并且可以使用 RequestDispatcher 调用公开。所以只用它来保护您的内容,但对于图像,请将其放在网络路径中的其他文件夹中
经过几个小时的调查,我得出了一个结论:
我的问题与 spring 无关,这是我的 eclipse 项目的问题。看来,只要我不在 eclipse 中刷新我的项目,tomcat 服务器就无法访问新上传的文件——而旧文件已从文件系统中删除但仍在 eclipse 项目中一直可以访问。
我在首选项 -> 常规 -> 工作区 -> "Refresh using native hooks and polling" 和 "Refresh on access" 中打开了两个自动刷新选项,这暂时解决了我的问题。
感谢您的帮助!