这篇文章主要介绍了在SpringBoot中验证用户上传的图片资源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

允许用户上传图片资源(头像,发帖)是APP常见的需求,特别需要把用户的资源IO到磁盘情况下,需要防止坏人提交一些非法的文件,例如木马,webshell,可执行程序等等。这类非法文件不仅会导致客户端图片资源显示失败,而且还会给服务器带来安全问题。

通过文件后缀判断文件的合法性

这种方式比较常见,也很简单,是目前大多数APP选择的做法。

public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {// 原始文件名称String fileName = multipartFile.getOriginalFilename();// 解析到文件后缀,判断是否合法int index = fileName.lastIndexOf(".");String suffix = null;if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {return "文件后缀不能为空";}// 允许上传的文件后缀列表Set allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));if (!allowSuffix.contains(suffix.toLowerCase())) {return "非法的文件,不允许的文件类型:" + suffix;}// 序列化到磁盘中的文件上传目录, /upload// FileCopyUtils.copy 方法会自动关闭流资源FileCopyUtils.copy(multipartFile.getInputStream(), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));// 返回相对访问路径,文件名极有可能带中文或者空格等字符,进行uri编码return  "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
}

使用 ImageIO 判断是否是图片

这个方法就比较严格了,在判断后缀的基础上,使用Java的ImageIO类去加载图片,尝试读取其宽高信息,如果不是合法的图片资源。则无法读取到这两个数据。就算是把非法文件修改了后缀,也可以检测出来。

public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {// 原始文件名称String fileName = multipartFile.getOriginalFilename();// 解析到文件后缀int index = fileName.lastIndexOf(".");String suffix = null;if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {return "文件后缀不能为空";}// 允许上传的文件后缀列表Set allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));if (!allowSuffix.contains(suffix.toLowerCase())) {return "非法的文件,不允许的文件类型:" + suffix;}// 临时文件File tempFile = new File(System.getProperty("java.io.tmpdir"), fileName);try {// 先把文件序列化到临时目录multipartFile.transferTo(tempFile);try {// 尝试IO文件,判断文件的合法性BufferedImage  bufferedImage = ImageIO.read(tempFile);bufferedImage.getWidth();bufferedImage.getHeight();} catch (Exception e) {// IO异常,不是合法的图片文件,返回异常信息return "文件不是图片文件";}// 复制到到上传目录FileCopyUtils.copy(new FileInputStream(tempFile), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));// 返回相对访问路径return  "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);} finally {// 响应客户端后,始终删除临时文件tempFile.delete();}
}

总结

使用ImageIo的方式更为保险,但是需要多几次IO操作。比较消耗性能。而且今天APP大都是用云存储服务,类似于阿里云的OSS。直接就把客户端上传的文件PUT到了云端,才不管用户上传的图片是不是真正的图片,非法上传,最多导致客户端不能显示而已,但是威胁不了服务器的安全。

SpringBoot如何验证用户上传的图片资源相关推荐

  1. springboot用户上传头像

    用户上传头像流程 1.图片上传至服务器 @PostMapping("upload") public String uploadHeader(MultipartFile header ...

  2. SpringBoot+MongoDB GridFS文件上传、下载、预览实战

    SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...

  3. SpringBoot + Vue实现博文上传+展示+博文列表

    文章目录 前言 实现效果 博文列表 文章编辑 文章显示 博文列表 前端 后端接口 博文上传 前端 后端 登录验证 博文上传 博文显示 前端 后端 总结 前言 ok,又到了水文时间了,那么今天带来的是这 ...

  4. springboot文件上传服务器,SpringBoot: 浅谈文件上传和访问的坑 (MultiPartFile)

    本次的项目环境为 SpringBoot 2.0.4, JDK8.0. 服务器环境为CentOS7.0, Nginx的忘了版本. 前言 SpringBoot使用MultiPartFile接收来自表单的f ...

  5. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  6. 用户上传头像以及BUG修改

    持久层 1.sql语句的规划 上传文件的操作其实是:先将用户上传的文件保存到服务器端的某个位置,然后将保存文件的路径记录在数据库中.当后续需要使用该文件时,从数据库中读出文件的路径,即可实现在线访问该 ...

  7. Springboot + layui + FTP文件上传删除 + HTTP文件下载预览 + pdf.js文件预览(项目实战总结)

    文件管理 0.需求及前言 1.前端,上传按钮嵌入数据表格中 2.利用IIS部署FTP文件服务器 3.后台FTP连接和文件操作 4.FTP遇到的问题和解决方案 5.预览PDF文件V1.0:FTP+临时文 ...

  8. springboot整合amazonS3,封装上传文件接口

    之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档.今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的? 1.项目结构 2.在pom ...

  9. vsftpd匿名用户上传和下载的配置

    看到很多朋友配置vsftpd时不能使用匿名用户上传和下载(创建目录或删除.重命名文件夹),本文主要解决vsftpd的匿名用户权限配制问题. 配置要注意三部分,请一一仔细对照: 1.vsftpd.con ...

最新文章

  1. 【Docker】Docker的三大核心组件
  2. 智源学术顾问David Harel:经典建模与AI的联姻,如何攻破机器学习的可解释性?| 大师讲座...
  3. 机器学习:基于关联规则的多标签分类器
  4. STL源码剖析(四)
  5. 浏览器兼容--条件样式,选择符前缀,样式属性前缀(转)
  6. 20170907wdVBA_GetCellsContentToExcel
  7. 生产性企业CO部分月结流程及系统步骤
  8. Intel® Nehalem/Westmere架构/微架构/流水线 (1) - 特性概述
  9. 清屏函数 mysql,mysql中的常用函数总结
  10. http后面的双斜杠被转义_【实用干货】双荧光素酶报告基因检测
  11. lanmp_wdcp_v2.4快速安装RPM包发布
  12. 粒子群算法优化BP和Elman神经网络-matlab源码
  13. 龙芯ejtag 单步调试pmon
  14. 汉诺塔问题(看完就记住)
  15. vtt或srt字幕挂载
  16. 剑指OFFER思路总结与代码分享——树篇(Java实现)
  17. “听我说谢谢你”还能用古诗来说?清华搞了个“据意查句”神器,一键搜索你想要的名言警句...
  18. threeJS导入FBX模型
  19. 计算机系统的组成一般不包括,计算机系统的基本组成,一般应包括哪些
  20. Proteus8.12的卸载

热门文章

  1. 1.3 万亿条数据查询,知乎如何做到毫秒级响应?
  2. 还有多久才能用上2000元以下的5G手机?答案来了
  3. 数据结构之列表 timeit
  4. 爬虫之selenium爬取斗鱼网站
  5. 机器视觉应用软件开发步骤及流程
  6. 【OpenCV 4开发详解】图像膨胀
  7. 巨杉数据库通过“Mpp数据库基础能力认证”,权威技术认证金融级数据库
  8. 布局AR VR领域?Tessera 8.5亿美元收购音频公司DTS
  9. 《Haskell并行与并发编程》——第2章,第2.1节惰性求值和弱首范式
  10. FindAllAnagramsinaString