1.导包
2.springMVC-servlet.xml的配置
<!-- 文件上传的配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
文件的编码格式
<property name="defaultEncoding" value="UTF8"></property>
上传文件的最大大小 单位为字节 -1就是不限制大小
<property name="maxUploadSize" value="10000000"></property>
上传多个文件时,每个文件的大小限制
<property name="maxUploadSizePerFile"></property>
上传文件时,内存中最大的大小,如果超过这个大小,存到临时文件中
<property name="maxInMemorySize"></property>
设置储存临时文件的路径(文件夹即可)
<property name="uploadTempDir"></property>
1. controller
*
单文件上传
MultipartFile:用来接受前台传过来的文件
@PostMapping("/upload")
//参数就是上传的文件
public String uploadSingleFile(@RequestParam MultipartFile file) throws IllegalStateException, IOException {
文件是否为空
file.isEmpty());
上传文件时,给的参数的名称, input标签中name属性的值
file.getName();
获取文件的类型,例如图片,文本,视屏等等
file.getContentType();
获取文件名称
String fileName = file.getOriginalFilename();
获取文件大小
long fileSize = file.getSize();
将上传的文件保存到服务器上的磁盘路径下
获取当前工程的根目录的相对路径 /工程名
request.getContextPath();
当前文件部署到服务器上时,工程在服务器上的绝对路径
String path = request.getRealPath("/");
当上传的文件,储存在服务器上的话,那么当服务器重新运行时,上传的文件可能会消失
将文件保存在磁盘上,为该位置配置一个虚拟路径
储存在磁盘上
String uploadPath = "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
String savePath = uploadPath + "\\" + fileName;
File uploadFile = new File(savePath);
将文件转移到参数文件中
file.transferTo(uploadFile);
return "success";
}
1.原生的response进行单文件下载
@GetMapping("/download")
@ResponseBody
public void download(@RequestParam("name") String fileName,HttpServletResponse response) throws IOException {
String uploadPath = "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
String downloadPath = uploadPath + "\\" + fileName;
设置为下载方式
response.setContentType("application/x-msdownload");
下载文件显示的名称
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
File file = new File(downloadPath);
将第一个参数中的文件内容。拷贝response的输出流管道中,
可以输出到前端
Files.copy(file.toPath(), response.getOutputStream());
}
springMVC提供的单文件下载
springMVC
ResponseEntity:向前端响应内容时,待响应状态
不只可以用在下载上,可以用在所有的返回值内容为json的时候
@GetMapping("/download2")
@ResponseBody
public ResponseEntity<byte[]> download(@RequestParam("name") String fileName) throws IOException{
String uploadPath = "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
String filePath = uploadPath + "//" + fileName;
File file = new File(filePath);
设置响应头
HttpHeaders headers = new HttpHeaders();
设置响应内容的格式为二进制流的
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
设置下载文件的名称
headers.setContentDispositionFormData("attachment", fileName);
将要下载的文件转换为字节数组的方式
byte[] bytes = FileUtils.readFileToByteArray(file);
创建ResponseEntity对象
/*
* 1.要返回给前端的数据
* 2.响应头的设置
* 3.响应的状态码
*/
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
return entity;
}
springmvc提供的下载方式和原生的区别
使用response的outputStream和人spring方式下载
spring将文件一次性交给前端
原生的到输出管道中
当文件比较大的时候,一次性交给前端,很有可能会造成网络的阻塞
也有可能内存不够,像上面,我们是将文件一次性输出到字节数组中,然后
给前端返回,字节数组是内存中存储着的,就会导致内存不够用
原生的,将文件输出到outputStream中去了,一边输出一边下载,对内存的压力小
多文件的上传
@PostMapping("/uploads")
public String uploadFiles(@RequestParam MultipartFile[] files) throws IllegalStateException, IOException {
String uploadPath = "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
for (MultipartFile file : files) {
String fileName = file.getOriginalFilename();
String filePath = uploadPath + "\\" + fileName;
File uploadFile = new File(filePath);
file.transferTo(uploadFile);
}
return "success";
}
多文件的下载
多文件下载,将要下载的文件放到一个压缩包中,给前端返回一个压缩好的文件
@GetMapping("/downloads")
@ResponseBody
public ResponseEntity<byte[]> downloadFiles(@RequestParam("names") String[] fileNames) throws IOException{
文件所在的文件夹地址
String uploadPath = "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
压缩文件的名称
String zipFileName = "files.zip";
输出流,参数路径为压缩文件的路径
FileOutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\tmp\\" + zipFileName);
ZipOutputStream zipOutputStream = new ZipOutputStream(out);
遍历要压缩的文件名称
for (String fileName : fileNames) {
//文件的路径
String filePath = uploadPath + "\\" + fileName;
//文件压缩之后存放的对象
ZipEntry entry = new ZipEntry(fileName);
//将entry'对象存放到压缩输出流中,紧接着输出,就会输出该对象中
zipOutputStream.putNextEntry(entry);
//读取文件在输出到entry对象中
FileInputStream in = new FileInputStream(filePath);
int temp;
while ((temp = in.read()) != -1) {
zipOutputStream.write(temp);
zipOutputStream.flush();
}
//一次读写完成之后,关闭当前的entry,一边下一个entry能正常读写
zipOutputStream.closeEntry();
in.close();
}
zipOutputStream.close();
压缩好的文件已经有了,准备下载
设置响应头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", zipFileName);
File zipFile = new File("C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\tmp\\" + zipFileName);
byte[] bytes = FileUtils.readFileToByteArray(zipFile);
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(bytes,headers,HttpStatus.CREATED);
return entity;
}