springboot实现文件上传与下载
一: 文件上传
1.可以通过form表单测试,MultipartFile对象是通过form表单的file类型请求的,是通过表单的name值获取的value值
2.也可以通过swagger测试,访问路径:http://127.0.0.1:8081/swagger-ui.html#/
3.postman调接口测试
例如:通过 form表单测试:
1) 前端页面代码:
<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
头像:<input type="file" name="headerImg"><br>
<input type="submit" value="上传">
</form>
2)controller层代码
@RestController
public class UploadController {
// 文件上传 RequestMapping默认get请求
@PostMapping("/upload")
//MultipartFile对象是通过form表单的file类型请求的,是通过表单的name值获取的value值,也可以通过swagger测试
public void upload(MultipartFile headerImg) throws IOException {
// 单文件上传
if (!headerImg.isEmpty()) {
// 获取上传文件的原始名称,获取上传的文件的文件名 x.xxx(1.jpg)
String originalFilename = headerImg.getOriginalFilename();
// 设置上传文件的保存地址目录(存放在项目路径下)
String dirPath = "E:\\Movie";
// 字符串截取后缀名
// String suffix = uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf('.'));
// 设置上传后的文件名称(拼接) //获取uuid ,随机生成一个名字
String newFileName = UUID.randomUUID() + "_" + originalFilename;
//File.separator:自动匹配路径的分隔符(在不确定路径的分隔符是\还是/的时候可以使用)
//上传文件
headerImg.transferTo(new File(dirPath + File.separator + newFileName));
}
}
}
3)要上传大文件必须要配置yml文件
spring:
#配置上传文件大小设置
servlet:
multipart:
enabled: true
max-file-size: 10MB #单个文件的最大上限
max-request-size: 30MB #单个请求的文件总大小上限
二: 文件下载
1.导入依赖
<!--文件下载-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.yml文件中配置
spring:
# 设置文件大小
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
3.controller层测试代码
(1) 根据浏览器的不同进行编码设,返回编码后的文件名
在类中写这个方法即可:
public String getFileName(HttpServletRequest request, String filename) throws Exception {
//IE不同版本User-Agent中出现的各种关键词
String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
//获取请求头代理信息
String userAgent = request.getHeader("User-Agent");
for (String keyWord : IEBrowserKeyWords) {
if (userAgent.contains(keyWord)) {
//IE内核浏览器,统一为UTF-8编码显示
return URLEncoder.encode(filename, "UTF-8");
}
}
//其它浏览器统一为ISO-8859-1编码显示
return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
}
(2)下面 download()方法中的第二个参数filename是你想要下载的 文件名.后缀(例如:XXX.jpg),在发起请求的时候把文件名传进去,和文件路径拼接;
也可以直接在代码中写死,删掉方法中第二个形参,在方法中声明 String filename = “文件名.后缀”。
// 文件下载
@PostMapping("/download")
public ResponseEntity<byte[]> download(HttpServletRequest request, String filename) throws Exception {
// 确定要下载的文件路径
String dirPath = "文件路径";
// 创建该文件对象(谷歌所用)
File file = new File(dirPath + "/" + filename);
System.out.println(file);
//对文件名编码,防止中文乱码
filename = this.getFileName(request,filename);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
// 通知浏览器以下载的方式打开文件
headers.setContentDispositionFormData("attachment", filename);
// 定义以流的方式下载返回文件的数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 将该对象读取时按字节传送
byte[] array = FileUtils.readFileToByteArray(file);
// 使用SpringMVC框架的ResponseEntity对象封装返回下载数据
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(array, headers, HttpStatus.OK);
return responseEntity;
}
在此,祝各位帅哥美女,步步高升,一帆风顺!!!
还没有评论,来说两句吧...