SpringBoot嵌⼊式Tomcat⽂件上传、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)⽤户访问应该是服务器地址,如:localhost:9393/fileServer/uploadFiles/222.png
3)于是通过配置资源映射,使 url 中的 /uploadFiles/ 映射到本地的 E:\wmx\uploadFiles\ 即可,E:\wmx\uploadFiles 则为虚拟路径。
⽂件上传
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 完全⼀样。
1、l 内容如下,为了页⾯写起来⽅便,使⽤了 Thymeleaf 模板引擎,java web 应⽤,⾃然需要导⼊ web 组件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>www.wmx</groupId>
<artifactId>fileServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>fileServer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 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>
<!-- spring boot 测试组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1、应⽤全局配置⽂件内容如下:
#配置服务器
server:
port: 9393 #服务器端⼝
servlet:
context-path: /fileServer #应⽤上下⽂路径
spring:
servlet:
multipart: #配置⽂件上传
max-file-size: 1000MB #设置上传的单个⽂件最⼤值,单位可以是 MB、KB,默认为 1MB
max-request-size: 1024MB #设置多⽂件上传时,单次内多个⽂件的总量的最⼤值,单位可以是 MB、KB,默认为 10 M
uploadFile:
location: E:/wmx/uploadFiles #⾃定义上传⽂件本地保存路径
2、⽂件上传官⽹介绍:,除了配置上⾯的单个⽂件最⼤值已经单次上传总量以外,官⽹还提供了如下配置:
# MULTIPART (MultipartProperties)
spring.abled=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.solve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.
3、上传⽂件存放的⽬录,不应该写死在代码中,所以上⾯提供了在配置⽂件中配置 uploadFile.location 属性,将来类中使⽤ @Value 取值即可。
UploadFileController
1、⽂件上传后台控制台层代码如下,后期实现虚拟路径映射本地路径会修改。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
/**
* Created by Administrator on 2019/3/17 0017.
getsavefilename*/
@Controller
public class UploadFileController {
@Value("${uploadFile.location}")
private String uploadFileLocation;//上传⽂件保存的本地⽬录,使⽤@Value获取全局配置⽂件中配置的属性值
/**
* ⽂件上传,因为只是演⽰,所以使⽤ @ResponseBody 将结果直接返回给页⾯
*
* @param multipartFile
* @param request
* @return
* @throws IOException
*/
@PostMapping("uploadFile")
@ResponseBody
public String uploadFile(MultipartFile multipartFile, HttpServletRequest request) throws IOException {
if (multipartFile == null || multipartFile.isEmpty()) {
return "上传⽂件为空...";
}
//basePath拼接完成后,形如:192.168.1.20:8080/fileServer
String basePath = Scheme() + "://" + ServerName() + ":" + ServerPort() + ContextPath();
System.out.println("basePath=" + basePath);
String fileName = OriginalFilename();
File saveFile = new File(uploadFileLocation, fileName);
System.out.println("⽂件保存成功:" + Path());
Path().toString();
}
}
index.html
1、前端⽂件上传 form 表单如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>⽂件服务器</title>
</head>
<body>
<form id="uploadForm" method="post" action="localhost:9393/fileServer/uploadFile" enctype="multipart/form-data">
<input type="file" name="multipartFile" /><br>
<input type="submit" id="uploadButton" value="上传" >
</form>
</body>
</html>
上传测试
url 映射虚拟路径
1、使⽤资源映射虚拟路径很简单,使⽤ WebMvcConfigurer 扩展配置即可,不熟悉的可以参考《Web 项⽬ tiger 之3 WebMvcConfigurer 实现登录与拦截、过滤静态资源》中的“⾃定义资源映射”部分。
1、⾸先修改⼀下 l ⽂件:
#配置服务器
server:
port: 9393 #服务器端⼝
servlet:
context-path: /fileServer #应⽤上下⽂路径
spring:
servlet:
multipart: #配置⽂件上传
max-file-size: 1000MB #设置上传的单个⽂件最⼤值,单位可以是 MB、KB,默认为 1MB
max-request-size: 1024MB #设置多⽂件上传时,单次内多个⽂件的总量的最⼤值,单位可以是 MB、KB,默认为 10 M
uploadFile:
resourceHandler: /uploadFiles/** #请求 url 中的资源映射
location: E:/wmx/uploadFiles/ #⾃定义上传⽂件本地保存路径
WebMvcConfigurer
1、再扩展 webMvc 配置,设置资源映射:
import org.springframework.beans.factory.annotation.Value;
import t.annotation.Configuration;
import org.springframework.fig.annotation.ResourceHandlerRegistry;
import org.springframework.fig.annotation.WebMvcConfigurer;
/**
* WebMvc 扩展配置类,应⽤⼀启动,本类就会执⾏
* Created by Administrator on 2019/3/17 0017.
*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Value("${sourceHandler}")
private String resourceHandler;//请求 url 中的资源映射,不推荐写死在代码中,最好提供可配置,如 /uploadFiles/**
@Value("${uploadFile.location}")
private String location;//上传⽂件保存的本地⽬录,使⽤@Value获取全局配置⽂件中配置的属性值,如 E:/wmx/uploadFiles/
/**
* 配置静态资源映射
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//就是说 url 中出现 resourceHandler 匹配时,则映射到 location 中去,location 相当于虚拟路径
//映射本地⽂件时,开头必须是 file:/// 开头,表⽰协议
registry.addResourceHandler(resourceHandler).addResourceLocations("file:///" + location);
}
}
UploadFileController
1、改写⼀下控制器。特别提醒⼀句:实际应⽤中,⽂件上传之后,应该往数据库插⼊记录,如 url 相对路径: uploadFiles/222.png,下⾯因为只是作为演⽰,⽂件上传之后,直接返回了浏览器访问的 url 路径了,并没有保存数据。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
/**
* Created by Administrator on 2019/3/17 0017.
*/
@Controller
public class UploadFileController {
@Value("${sourceHandler}")
private String resourceHandler;//请求 url 中的资源映射,不推荐写死在代码中,最好提供可配置,如 /uploadFiles/**
@Value("${uploadFile.location}")
private String uploadFileLocation;//上传⽂件保存的本地⽬录,使⽤@Value获取全局配置⽂件中配置的属性值,如 E:/wmx/uploadFiles/
/**
* ⽂件上传,因为只是演⽰,所以使⽤ @ResponseBody 将结果直接返回给页⾯
*
* @param multipartFile
* @param request
* @return
* @throws IOException
*/
@PostMapping("uploadFile")
@ResponseBody
public String uploadFile(MultipartFile multipartFile, HttpServletRequest request) throws IOException {
if (multipartFile == null || multipartFile.isEmpty()) {
return "上传⽂件为空...";
}
//basePath拼接完成后,形如:192.168.1.20:8080/fileServer
String basePath = Scheme() + "://" + ServerName() + ":" + ServerPort() + ContextPath();
String fileName = OriginalFilename();
String fileServerPath = basePath + resourceHandler.substring(0, resourceHandler.lastIndexOf("/") + 1) + fileName;
System.out.println("⽂件访问路径:" + fileServerPath);
File saveFile = new File(uploadFileLocation, fileName);
System.out.println("⽂件保存路径:" + Path());
return "<a href='" + fileServerPath + "'>" + fileServerPath + "</a>";
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论