springboot 图片映射404问题
问题:
今天简单的将springboot项目搭配起来后,想配置一下静态图片的访问。
springboot静态内容默认是/static (or /public or /resources or /META-INF/resources)这四个目录。
如果需要添加映射而不是完全修改的话,可以添加一个WebMvcConfigurer类并重写addResourceHandlers这个方法,如下:
@Configuration
public class ResourceHandler implements WebMvcConfigurer {@Value("${upload}")private String uploadPattern;@Value("${upload.location}")private String uploadLocation;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(uploadPattern).addResourceLocations("file:" + uploadLocation);}
}
upload.location=D:/uploadFile
upload=/upload/**
配置如上,但是问题来了,通过localhost:8080/upload/xx.png访问后得到的是404的错误页。
解决方案如下:
将upload.location=D:/uploadFile修改为upload.location=D:/uploadFile/
分析
每个请求都会经过DispatcherServlet的doService方法,继而调用doDispatch。
于是断点进入doDispatch:
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
继续下一步发现是调用了HttpRequestHandlerAdapter的handle方法,这个方法又调用了ResourceHttpRequestHandler.handleRequest方法。
看到这里大概明白了,先获取资源,获取不到就404,于是继续跟踪下去。查看getResource方法:
@Overridepublic void handleRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// For very general mappings (e.g. "/") we need to check 404 firstResource resource = getResource(request);//...
@Nullableprotected Resource getResource(HttpServletRequest request) throws IOException {//...Resource resource = this.resolverChain.resolveResource(request, path, getLocations());//...}
在这里资源为null,继续跟踪。
善于运用这个可以反复进来方法,不用每次都刷新页面
一路向下debug,到了PathResourceResolver.getResource方法,这里返回的resource为空
@Nullableprivate Resource getResource(String resourcePath, @Nullable HttpServletRequest request,List<? extends Resource> locations) {//...Resource resource = getResource(pathToUse, location);//...
进入getResource方法,发现调用是location.createRelative(resourcePath);
实际是FileUrlResource.createRelative
public Resource createRelative(String relativePath) throws MalformedURLException {return new FileUrlResource(this.createRelativeURL(relativePath));}
在这里createRelativeURL这个方法返回的数据不正常:
命名映射的是D:/uploadFile/xxx.jpg,怎么就变成了D:/xx.jpg呢,怪不得获取不到资源
进入方法查看:
protected URL createRelativeURL(String relativePath) throws MalformedURLException {if (relativePath.startsWith("/")) {relativePath = relativePath.substring(1);}relativePath = StringUtils.replace(relativePath, "#", "%23");return new URL(this.url, relativePath);}
URL构造函数:
public URL(URL context, String spec, URLStreamHandler handler)
throws MalformedURLException
{//...
handler.parseURL
}
实际调用URLStreamHandler.parseURL
if (start < limit) {if (spec.charAt(start) == '/') {path = spec.substring(start, limit);} else if (path != null && path.length() > 0) {isRelPath = true;int ind = path.lastIndexOf('/');String seperator = "";if (ind == -1 && authority != null)seperator = "/";path = path.substring(0, ind + 1) + seperator +spec.substring(start, limit);} else {String seperator = (authority != null) ? "/" : "";path = seperator + spec.substring(start, limit);}}
看到这里才明白,int ind = path.lastIndexOf(’/’);这里把我的D:/uploadFile截取为D:/了,怪不得最后返回的是D:/xx.png,这路径都被改了,还怎么能找到资源。至此,发现了问题,于是把upload.location=D:/uploadFile修改为upload.location=D:/uploadFile/即可。
springboot 图片映射404问题相关推荐
- HTML CSS简介与图片映射
1. CSS 入门 内联样式:在 HTML 元素中使用 "style" 属性,需要将表现与内容混在一起: 内部样式表:在 HTML 文档头部 <head> 区域使用 & ...
- springboot怎么返回404_自定义SpringBoot REST API 404返回信息
自定义SpringBoot REST API 404返回信息 在访问SpringBoot的REST接口时,如果请求的地址不存在Spring会返回如下JSON信息 { "timestamp&q ...
- 404 jpeg图片_nginx中获取图片抛404错误
问题是这样的,用的是TP框架,web服务器是nginx.重写了uri使其请求时过滤了/index.php/* 上线后,页面获取js正常,获取css也正常,但在读取css中设好的png,jpg等图片时报 ...
- 图片映射字体反爬-某租房网
目录 处理流程 构建脚本框架 分析租房信息生成 页面分析 具体步骤 解决图片映射问题 那么如何处理图片? 处理映射字体 数据提取 处理流程 构建脚本框架 分析租房信息生成 解决图片映射问题 数据提取 ...
- 图片映射(HTML map标签)这么拽,小伙伴们都知道吗?
在一些购物网站,我们总能看到一张大图,上面铺满充满诱惑的礼品,当我们轻轻地用鼠标单击一下,就跳转到这个宝贝的页面. 对于这个神奇的功能,身边的小伙伴们往往都被震惊了.要是能够学会这招技能,那该多好啊, ...
- java base64上传图片|接口读取图片,springboot配置映射读取资源
1.上传图片 public static String uploadImg(String baseImg,String basePath,String fileSavePath,HttpServlet ...
- SpringBoot如何映射图片地址
文件上传下载是web开发常见项目,本地开发时一般都使用本地存储进行测试,但是图片上传时往往需要回显,这就需要url地址否则不能正常回显,所以需要地址进行映射 @Configuration //首先自定 ...
- 配置springboot在访问404时自定义返回结果以及统一异常处理
在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...
- 解决决SpringBoot图片上传需重启服务器才能显示的问题
问题描述: 前端页面实现头像图片上传并实时更新显示的功能,但是文件上传成功后不能实时显示,必须重启服务器后才能显示出来 下图是我将图片文件上到到的目录,及项目架构 问题发生的原因 这是服务器的自我保护 ...
最新文章
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
- ASA用ASDM管理时报unable to launch device manager xxx.xxx.xxx.xxx
- 通俗易懂的讲解一下Java的代理模式
- 【哲学】《哲学的故事》笔记
- 数据库 SQL语法一
- 一站式学习Wireshark(转载)
- .NET SDK-Style 项目(Core、Standard、.NET5)中的版本号
- python线性加权模型_局部加权之线性回归(1) - Python实现
- 电脑尺寸大小在哪里看_科技资讯:电脑弹出本地计算机上的服务启动后停止的提示在哪里看...
- 深度学习自学(七):腾讯移动端开源框架ncnn学习总结
- Color-UI 简介及使用教程
- Android开发-魔窗DeeplinkDemo-AndroidStudio
- vue2.5去哪儿(慕课网)学习笔记
- 他如何从一位专车司机成功变身CEO?
- 你的深度思考能力,是如何一步步被毁掉的?
- Shell中的join用法
- 已知总图的边和子图顶点,判断子图连通性
- 联想Y7000在配置ubuntu16.04过程中所遇到的一些问题.例如WIFI禁用,外接屏显示错误,NVIDIA驱动安装等
- nat123内网映射到外网
- python豆瓣历史评分_基于Python的豆瓣电影评分查询器