目录

url 映射虚拟路径需求分析

url 映射虚拟路径配置

嵌入式 Tomcat 文件上传

web 网络文件下载

The temporary upload location is not valid

解决下载文件名称乱码


url 映射虚拟路径需求分析

1、Java web 应用开发完成后如果是导入外置的 Tomcat 的 webapps 目录的话,那么上传的文件可以直接的放在应用的 web 目录下去就好了,浏览器可以很方便的进行访问。

2、Spring Boot 默认使用嵌入式 Tomcat ,将来打包成可执行 Jar 文件进行部署,显然打成 jar 包后,总不可能再将上传的文件放在 resources 目录下去了,肯定是放在其它的磁盘目录下。

3、Spring Boot 于是提供了 url 地址匹配本地虚拟路径的功能:

1)上传文件到服务器,服务器将文件保存到了本地,如:E:\wmx\uploadFiles\222.png
2)用户访问应该是服务器地址,如:http://localhost:9393/fileServer/uploadFiles/222.png
3)于是通过配置资源映射,使 url 中的 /uploadFiles/ 映射到本地的 E:\wmx\uploadFiles\ 即可,E:\wmx\uploadFiles 则为虚拟路径。

4、url 映射虚拟路径主要是针对网络访问和下载,与文件上传关系不大。

url 映射虚拟路径配置

1、使用资源映射虚拟路径很简单,使用 WebMvcConfigurer 扩展配置即可,可参考自定义资源映射虚拟路径

2、全局配置文件自定义配置:

uploadFile:resourceHandler: /uploadFiles/**   #请求 url 中的资源映射location: E:/wmx/uploadFiles/ #自定义上传文件本地保存路径

src/main/resources/application.yml · 汪少棠/fileServer - Gitee.com

3、WebMvcConfigurer 扩展 webMvc 配置,设置资源映射

/*** WebMvc 扩展配置类,应用一启动,本类就会执行* url 映射虚拟路径配置** @author wangMaoXiong* Created by Administrator on 2019/3/17 0017.*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {private static final Logger logger = LoggerFactory.getLogger(MyWebMvcConfigurer.class);/*** 请求 url 中的资源映射,不推荐写死在代码中,最好提供可配置,如 /uploadFiles/***/@Value("${uploadFile.resourceHandler}")private String resourceHandler;/*** 上传文件保存的本地目录,使用@Value获取全局配置文件中配置的属性值,如 E:/wmx/uploadFiles/*/@Value("${uploadFile.location}")private String location;/*** 如果上传文件保存的本地目录不存在,则创建,否则后期保存文件时,容易出现找不到路径的错误*/@PostConstructpublic void init() {File file = new File(location);if (!file.exists()) {file.mkdirs();logger.debug("服务器文件存在目录={},已经不存在,进行新建。", location);} else {logger.debug("服务器存储目录已经存在={}", location);}}/*** 配置静态资源映射** @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//就是说 url 中出现 resourceHandler 匹配时,则映射到 location 中去,location 相当于虚拟路径//映射本地文件时,开头必须是 file:/// 开头,表示协议registry.addResourceHandler(resourceHandler).addResourceLocations("file:///" + location);}
}

​src/main/java/com/wmx/www/config/MyWebMvcConfigurer.java · 汪少棠/fileServer - Gitee.com

嵌入式 Tomcat 文件上传

1、Java JDK 1.8 + Spring Boot 2.1.3 新建 web 项目,spring boot 版本不同,可能略有差异。

2、spring boot 的 web 组件中的 org.springframework:spring-web 已经集成了文件上传功能,无需再导入以前的 commons-io、commons-fileupload 了,使用方式和之前的 commons-fileupload 完全一样。

一:pom.xml 内容如下,为了页面写起来方便,使用了 Thymeleaf 模板引擎,java web 应用,自然需要导入 web 组件。

         <!-- thymeleaf 模板引擎--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- web 组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

二:application.yml 全局配置文件内容如下:

#配置服务器
server:port: 8080 #服务器端口servlet:context-path: /fileServer #应用上下文路径spring:servlet:multipart: #配置文件上传max-file-size: 1000MB #设置上传的单个文件最大值,单位可以是 MB、KB,默认为 1MBmax-request-size: 1024MB #设置多文件上传时,单次内多个文件的总量的最大值,单位可以是 MB、KB,默认为 10 MuploadFile:resourceHandler: /uploadFiles/**   #请求 url 中的资源映射location: E:/wmx/uploadFiles/ #自定义上传文件本地保存路径

src/main/resources/application.yml · 汪少棠/fileServer - Gitee.com

1、上传文件存放的目录,不应该写死在代码中,所以上面提供了在配置文件中配置 uploadFile.location 属性,将来类中使用 @Value 取值即可。

2、文件上传官网介绍:Handling Multipart File Uploads,除了配置上面的单个文件最大值已经单次上传总量以外,官网还提供了如下配置:

# MULTIPART (MultipartProperties)
spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
spring.servlet.multipart.location= # Intermediate location of uploaded files.
spring.servlet.multipart.max-file-size=1MB # Max file size.
spring.servlet.multipart.max-request-size=10MB # Max request size.
spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.

三:文件上传后台控制台层代码如下:

    /*** 请求 url 中的资源映射,不推荐写死在代码中,最好提供可配置,如 /uploadFiles/***/@Value("${uploadFile.resourceHandler}")private String resourceHandler;/*** 上传文件保存的本地目录,使用 @Value获 取全局配置文件中配置的属性值,如 E:/wmx/uploadFiles/*/@Value("${uploadFile.location}")private String uploadFileLocation;/*** http://localhost:8080/fileServer/uploadFile* 文件上传,因为只是演示,所以使用 @ResponseBody 将结果直接返回给页面** @param singleFile :上传的文件对象* @param request    :请求对象* @return :返回的是文件名称,将来客户端可以用来下载* @throws IOException*/@PostMapping("uploadFile")@ResponseBodypublic String uploadFile(MultipartFile singleFile, HttpServletRequest request) throws IOException {if (singleFile == null || singleFile.isEmpty()) {logger.debug("上传文件为空...");return "上传文件为空...";}//basePath拼接完成后,形如:http://192.168.1.20:8080/fileServerString basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();String fileName = singleFile.getOriginalFilename();String fileServerPath = basePath + resourceHandler.substring(0, resourceHandler.lastIndexOf("/") + 1) + fileName;logger.debug("文件访问路径:{}", fileServerPath);File saveFile = new File(uploadFileLocation, fileName);/*** 文件保存,注意目的文件夹必须事先存在,否则保存时报错* 在{@link MyWebMvcConfigurer}中已经处理了,如果不存在,自动新建存储目录*/singleFile.transferTo(saveFile);logger.info("文件保存路径:{}", saveFile.getPath());return "<a target='_blank' href='" + fileServerPath + "'>" + fileServerPath + "</a>";}

src/main/java/com/wmx/www/controller/UploadFileController.java · 汪少棠/fileServer - Gitee.com

四:前端文件上传 form 表单如下:

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title>文件服务器</title>
</head>
<body>
<h3>单文件上传,成功后返回访问地址,可以查看并下载</h3>
<form method="post" target="_blank" action="/fileServer/uploadFile" enctype="multipart/form-data"><input type="file" name="singleFile" style="font-size: 20px"/><br><input type="submit" id="singleFileUploadButton1" value="上传" style="font-size: 30px">
</form>
</body>
</html>

src/main/resources/templates/index.html · 汪少棠/fileServer - Gitee.com

web 网络文件下载

    /*** 文件下载 · 使用 FileUtils.readFileToByteArray 读取文件内容* http://localhost:8080/fileServer/download2?id=f41e995ba7454a9da1bcd975c7460fcd.png** @param response* @param id       :文件名称,如 123.xtx* @return*/@RequestMapping(value = {"/download2"}, method = {RequestMethod.GET})public void download2(HttpServletResponse response, String id) {OutputStream outputStream = null;try {logger.debug("文件下载:{}", id);File saveFile = new File(uploadFileLocation, id);if (saveFile.exists()) {//设置返回类型,必须对文件名称进行编码,否则中午容易乱码response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(id, "UTF-8"));//构建文件输入流。推荐使用:org.apache.commons.io.FileUtils.readFileToByteArraybyte[] byteArray = FileUtils.readFileToByteArray(saveFile);//写入输出流返回给客户端outputStream = new BufferedOutputStream(response.getOutputStream());if (byteArray != null && byteArray.length > 0) {outputStream.write(byteArray);}} else {//设置头信息response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("【" + id + "】文件不存在!");logger.warn("【{} 】文件不存在!", id);}} catch (IOException e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.flush();outputStream.close();} catch (IOException e) {e.printStackTrace();}}}logger.info("文件下载完成:{}", id);}

src/main/java/com/wmx/www/controller/UploadFileController.java · 汪少棠/fileServer - Gitee.com

Post 请求文件下载在线演示源码:后端导出接口、POI Word工具类、前端页面

The temporary upload location is not valid

1、Spring boot 文件上传时有时候会出现此错误(临时上传存储位置无效):java.io.IOException: The temporary upload location [C:\Users\...\ROOT] is not valid

2、解决办法如下:

方式1)重启项目,自动重新生成临时存储路径

方式2)全局配置文件中配置:spring.servlet.multipart.locatio= 上传文件的临时存储目录

方式3)注入一个 Bean,手动添设置下临时存储路径,代码如下:

@Bean  
MultipartConfigElement multipartConfigElement() {  
   MultipartConfigFactory factory = new MultipartConfigFactory();  
   factory.setLocation("d://temp");  
   return factory.createMultipartConfig();  
}

解决下载文件名称乱码

https://wangmaoxiong.blog.csdn.net/article/details/106978811#t5

Spring Boot 文件上传下载、url 映射虚拟路径、解决下载文件名称乱码相关推荐

  1. Spring boot项目上传Linux服务器后 上传图片后,图片路径报404,图片路径映射问题

    问题 spring boot项目上传到Linux服务器后,头像上传后报404.但是我的打包的jar包在idea客户端运行是没问题的 解决 错误代码 @Overridepublic void addRe ...

  2. Spring Boot 批量上传: The field files exceeds its maximum permitted size of 1048576 bytes.

    Spring Boot 批量上传异常: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededExcep ...

  3. Spring Boot:上传文件大小超限制如何捕获 MaxUploadSizeExceededException 异常

    Spring Boot 默认上传文件大小限制是 1MB,默认单次请求大小是 10MB,超出大小会跑出 MaxUploadSizeExceededException 异常. 问题来了,当文件超过 1M ...

  4. java struts2 excel上传_文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术...

    文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术 如题:文件信息的批量导入-- 项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中 ...

  5. node 生产的env文件怎么注入_前端各种文件上传攻略,从小图片到大文件断点续传...

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  6. 写给新手前端的各种文件上传攻略,从小图片到大文件断点续传

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  7. 前端各种文件上传攻略,从小图片到大文件断点续传

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  8. Spring Boot (30) 上传文件

    文件上传 上传文件和下载文件是Java Web中常见的一种操作,文件上传主要是将文件通过IO流传输到服务器的某一个文件夹下. 导入依赖 在pom.xml中添加上spring-boot-starter- ...

  9. spring boot +ajax上传文件前后端分离完整实现示例代码

    1.案例场景 此处,我这里需要前端实现上传身份证OCR识别证件号码. 2.前端实现方式 2.1页面按钮 <div class="title-icon"></div ...

  10. Spring Boot——获取上传文件的MD5值解决方案

    解决方案 方法一: /*** 上传文件* @param file 文件* @return ResponseBean*/@ApiOperation(value = "上传文件",no ...

最新文章

  1. 一文读懂AI 与神经网络发展历程
  2. 解决IE不支持Data.parse()的问题
  3. Java剪切板操作大全
  4. docker安装rabbitmq延时队列插件
  5. OpenJudge NOI 1.8 25:螺旋加密
  6. oracle10g 操作系统,各版本操作系统ORACLE 10g 下载(包括windows和linux)
  7. python print format_Python中的format格式化输出
  8. [LibTorch Linux] 各版本 LibTorch 下载
  9. 微软官方WebCast视频打包下载
  10. mysql-------视图
  11. c语言挂科 合工大,合工大计算机学院程序设计01程序设计与C语言初步.ppt
  12. Innodb中的事务隔离级别和锁的关系
  13. 手写多图片合并成一张图片功能插件(水印合成)
  14. Spring Boot 容器选择 Undertow 而不是 Tomcat Spring Boot 内嵌容器Unde
  15. java模拟超市商品库存管理平台
  16. 详解c语言欧拉函数,【基础数论】十分钟学会计算欧拉函数
  17. 标准盒模型 与 怪异盒模型
  18. Java SE核心I
  19. 【存储】块存储、文件存储和对象存储的区别?
  20. 海康工业相机Python调用实现拍照

热门文章

  1. 推行ISO9000的作用及相关知识
  2. 怎么单选_听力三个选项都出的单选怎么破?| 附今日听力S1S2及听力原文
  3. mdk 加static会被优化吗_网站关键词排名优化你会吗?深圳龙岗网络外包公司讲解...
  4. SpringBoot @Async注解的学习
  5. 操作系统 第一部分 操作系统的基本概念
  6. DeepFake技术--实际操作
  7. ubuntu16.04 安装中文输入法
  8. Caffe学习:pycaffe接口配置
  9. Cython基础--Cython入门
  10. 2021-06-21结构伪类选择器