问题:

今天简单的将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问题相关推荐

  1. HTML CSS简介与图片映射

    1. CSS 入门 内联样式:在 HTML 元素中使用 "style" 属性,需要将表现与内容混在一起: 内部样式表:在 HTML 文档头部 <head> 区域使用 & ...

  2. springboot怎么返回404_自定义SpringBoot REST API 404返回信息

    自定义SpringBoot REST API 404返回信息 在访问SpringBoot的REST接口时,如果请求的地址不存在Spring会返回如下JSON信息 { "timestamp&q ...

  3. 404 jpeg图片_nginx中获取图片抛404错误

    问题是这样的,用的是TP框架,web服务器是nginx.重写了uri使其请求时过滤了/index.php/* 上线后,页面获取js正常,获取css也正常,但在读取css中设好的png,jpg等图片时报 ...

  4. 图片映射字体反爬-某租房网

    目录 处理流程 构建脚本框架 分析租房信息生成 页面分析 具体步骤 解决图片映射问题 那么如何处理图片? 处理映射字体 数据提取 处理流程 构建脚本框架 分析租房信息生成 解决图片映射问题 数据提取 ...

  5. 图片映射(HTML map标签)这么拽,小伙伴们都知道吗?

    在一些购物网站,我们总能看到一张大图,上面铺满充满诱惑的礼品,当我们轻轻地用鼠标单击一下,就跳转到这个宝贝的页面. 对于这个神奇的功能,身边的小伙伴们往往都被震惊了.要是能够学会这招技能,那该多好啊, ...

  6. java base64上传图片|接口读取图片,springboot配置映射读取资源

    1.上传图片 public static String uploadImg(String baseImg,String basePath,String fileSavePath,HttpServlet ...

  7. SpringBoot如何映射图片地址

    文件上传下载是web开发常见项目,本地开发时一般都使用本地存储进行测试,但是图片上传时往往需要回显,这就需要url地址否则不能正常回显,所以需要地址进行映射 @Configuration //首先自定 ...

  8. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

  9. 解决决SpringBoot图片上传需重启服务器才能显示的问题

    问题描述: 前端页面实现头像图片上传并实时更新显示的功能,但是文件上传成功后不能实时显示,必须重启服务器后才能显示出来 下图是我将图片文件上到到的目录,及项目架构 问题发生的原因 这是服务器的自我保护 ...

最新文章

  1. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
  2. ASA用ASDM管理时报unable to launch device manager xxx.xxx.xxx.xxx
  3. 通俗易懂的讲解一下Java的代理模式
  4. 【哲学】《哲学的故事》笔记
  5. 数据库 SQL语法一
  6. 一站式学习Wireshark(转载)
  7. .NET SDK-Style 项目(Core、Standard、.NET5)中的版本号
  8. python线性加权模型_局部加权之线性回归(1) - Python实现
  9. 电脑尺寸大小在哪里看_科技资讯:电脑弹出本地计算机上的服务启动后停止的提示在哪里看...
  10. 深度学习自学(七):腾讯移动端开源框架ncnn学习总结
  11. Color-UI 简介及使用教程
  12. Android开发-魔窗DeeplinkDemo-AndroidStudio
  13. vue2.5去哪儿(慕课网)学习笔记
  14. 他如何从一位专车司机成功变身CEO?
  15. 你的深度思考能力,是如何一步步被毁掉的?
  16. Shell中的join用法
  17. 已知总图的边和子图顶点,判断子图连通性
  18. 联想Y7000在配置ubuntu16.04过程中所遇到的一些问题.例如WIFI禁用,外接屏显示错误,NVIDIA驱动安装等
  19. nat123内网映射到外网
  20. python豆瓣历史评分_基于Python的豆瓣电影评分查询器

热门文章

  1. JS逆向 | ob混淆一键还原工具
  2. 开源中国(OSChina)源码解析(1)——源码导入
  3. 澳门大学之波尔图大学交换
  4. Plotly安装与使用方法
  5. 电大计算机科学与技术课程,大学计算机科学与技术专业(本科)专业课程设置及教学管理...
  6. 网摘:一位网友《塑造阳光心态》的学习心得
  7. J - 【黄色】这题真的是模板题 (Gym - 102072J )(spfa)
  8. ACA云原生4微服务和Serverless架构
  9. 测试管理工具列表大全
  10. 口红会染唇是什么意思_唇釉染唇是什么意思