SpringBoot文件访问映射的两种实现方式

业务需求:通过SpringBoot访问服务器(磁盘内)的所有文件,用于正常项目中上传图片(文件)的访问。

图片路径:E://images/upload/123.jpg,现在通过两种方式实现对图片的访问

方式一(推荐):

增加配置类实现WebMvcConfigurer接口,然后在addResourceHandlers方法中设置文件夹与访问路径之间的映射关系。
参考代码:

@Configuration
public class FileConfig implements WebMvcConfigurer {public void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/upload/**").addResourceLocations("file:" + "E://images/upload/");}
}

访问示例:
http://localhost:8080/upload/123.jpg

方式二:

专门新增一个接口作为图片(文件)访问的入口,接口中要进行编码转换,而且可以设置文件强制下载不打开
参考代码:

@RestController
@RequestMapping("/file")
public class FileController {private static final String FILE_PATH = "E://images/upload/";@GetMapping(value = "/static/**")public void view(HttpServletRequest request, HttpServletResponse response) {String imgPath = extractPathFromPattern(request);if(StringUtil.isEmpty(imgPath) || imgPath=="null"){return;}InputStream inputStream = null;OutputStream outputStream = null;try {imgPath = imgPath.replace("..", "");if (imgPath.endsWith(",")) {imgPath = imgPath.substring(0, imgPath.length() - 1);}String fileUrl = FILE_PATH + imgPath;File file = new File(fileUrl);if(!file.exists()){response.setStatus(404);throw new RuntimeException("文件不存在..");}response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));inputStream = new BufferedInputStream(new FileInputStream(fileUrl));outputStream = response.getOutputStream();byte[] buf = new byte[1024];int len;while ((len = inputStream.read(buf)) > 0) {outputStream.write(buf, 0, len);}response.flushBuffer();} catch (IOException e) {response.setStatus(404);e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}/***  ISO-8859-1 => UTF-8 进行编码转换*/private static String extractPathFromPattern(final HttpServletRequest request) {String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);}
}

访问示例:
http://localhost:8080/file/static/123.jpg

SpringBoot文件访问映射的两种实现方式相关推荐

  1. 简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?

    简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么? 参考答案: (1)ftp有两种登录方式:匿名登录和授权登录.使用匿名登录时,用户名为:anonymous ...

  2. SpringBoot的properties和yml两种配置方式, 配置注入参数, 以及配置文件读取失效的问题

    SpringBoot支持两种配置方式,一种是properties文件,一种是yml 首先在pom文件中添加依赖: <dependency><groupId>org.spring ...

  3. C语言头文件和源文件差异,#include两种引用方式差异

    一些初学c语言的人,不知道头文件(*.h文件)原来还可以自己写的.只知道调用系统库函数时,要使用#include语句将某些头文件包含进去.其实,头文件跟.c文件一样,是可以自己写的.头文件是一种文本文 ...

  4. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  5. PyQt5随笔:Qtdesigner设计转换而来的界面.py文件两种调用方式

    PyQt5随笔:Qtdesigner设计转换而来的界面.py文件两种调用方式 文章目录 PyQt5随笔:Qtdesigner设计转换而来的界面.py文件两种调用方式 1.前言 2.方式一:另建 py ...

  6. ftp 两种登陆方式,及区别

    FTP: 即 文件传输协议 题目:使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么? 参考答案: (1)ftp有两种登录方式:匿名登录和授权登录.使用匿名登录时 ...

  7. Java面试题:synchronized和对象的访问定位的两种方式

    说一说自己对于 synchronized 关键字的理解 ? synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时 ...

  8. 关于虚拟机中对象访问定位的两种方式的一些思考

    前言 本文是在周志明老师经典作品<深入理解Java虚拟机>第二章第三节的基础上对句柄和直接指针两种对象访问方式的深入思考,有不准确的地方希望读者不吝赐教. JVM中访问对象的两种方式 1. ...

  9. JavaBean实现多个文件上传的两种方法

    JavaBean实现多个文件上传的两种方法 王新芳        刘杰 北京工商大学计算机学院 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先 ...

最新文章

  1. C#给图片添加版权信息
  2. 从呼叫中心到移动互联网的演进
  3. 产品设计的从0到1全流程:以优惠券为例
  4. c#简单自定义异常处理日志辅助类
  5. Source Generator:C# 9 将迎来编译时元编程
  6. maven原型_Maven原型创建技巧
  7. css 做幻灯片效果
  8. 【社会/人文】概念的理解 —— 断舍离、饭(饭制版)
  9. Java:高级类特性
  10. 647.回文字符串 (力扣leetcode) 博主可答疑该问题
  11. 计算机在高分子材料与工程中的应用,计算机技术在高分子材料工程中的应用.doc...
  12. 百度3D地图API的调用以及适应过程
  13. ffmpeg里转场transition
  14. chrome浏览器一键切换搜索引擎,一键切换谷歌和百度搜索(不需要重新输入keyword,带关键词切换引擎)
  15. php货币符号怎么打,Magento修改货币符号和货币符号的位置
  16. yolov3模型训练并部署到K210(零基础也可)
  17. Android时间同步流程
  18. 大数据大创新-阿里巴巴云上数据中台之道
  19. 探索广播接收器的使用
  20. 2023年6月DAMA-CDGA/CDGP数据治理认证报名请尽早啦!

热门文章

  1. android huawei ale-tl00 不显示log,华为手机ALE_TL00为什么插卡不显示
  2. 用Arduino和esp8266检测WIFI信号强度
  3. Hspice学习笔记一
  4. Endnote 中批量导出PDF
  5. VNC viewer在windows与linux之间文本和文件拷贝
  6. 股市投资心经---做T的要领
  7. VS 2017系统找不到指定文件
  8. 「Unity3D」解决2022的PackageManager无法显示官方插件Burst和Collections的最新版本
  9. 怎样修复小米服务器,小米手机照片误删怎么恢复?教你巧用小米云服务回收站恢复数据...
  10. 【Unity】Mesh网格编程(三)万能网格几何形体