编写一个请求上传和下载的JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h3>上传 和 下载</h3> <p style="color: red">${UploadMessage}</p> <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post" > <p>上传的文件:<input type="file" name="UpFile"></p> <p>上传:<input type="submit"></p> </form> <p>下载的文件: <a href="${pageContext.request.contextPath}/download">文件资源</a></p> </body> </html>
导入上传工具依赖
Maven坐标
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
配置SpringMVC提供的文件上传工具类【还是依赖于上面的上传工具】
<!-- 文件上传配置 id="multipartResolver" 不能乱改 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 请求格式编码 和JSP的pageEncoding一致 统一UTF-8最好 --> <property name="defaultEncoding" value="UTF-8" /> <!-- 文件上传大小 10M --> <property name="maxUploadSize" value="10485760" /> <!-- 缓存? --> <property name="maxInMemorySize" value="40960" /> </bean>
完整的文件控制器
package cn.dai.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.servlet.ModelAndView; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; /** * @author ArkD42 * @file SpringMVC * @create 2020 - 05 - 07 - 20:07 */ @Controller public class FileController { @PostMapping("/upload") public String getUploadFile( @RequestParam("UpFile")CommonsMultipartFile file, HttpServletRequest request ) throws IOException { String fileName = file.getOriginalFilename(); if ("".equals(fileName)) { request.setAttribute("UploadMessage","文件上传失败"); return "forward:/UploadAndDownload.jsp"; } System.out.println("正在检查文件,文件名称:" + fileName); String savePath = "C:\Users\Administrator\Desktop\"; System.out.println("保存路径:" + savePath); InputStream inputStream = file.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream(new File(savePath, fileName)); int len; byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer))!= -1 ){ fileOutputStream.write(buffer,0,len); fileOutputStream.flush(); } fileOutputStream.close(); inputStream.close(); request.setAttribute("UploadMessage","文件上传成功"); return "forward:/UploadAndDownload.jsp"; } @PostMapping("/upload2") public String getUploadFile2( @RequestParam("UpFile")CommonsMultipartFile file, HttpServletRequest request ) throws IOException { String savePath = "C:\Users\Administrator\Desktop\"; System.out.println("保存路径:" + savePath); file.transferTo(new File(savePath + file.getOriginalFilename())); request.setAttribute("UploadMessage","文件上传成功"); return "forward:/UploadAndDownload.jsp"; } @RequestMapping("/download") public String download01( HttpServletRequest request, HttpServletResponse response ) throws Exception{ String path = "C:\Users\Administrator\Pictures\Saved Pictures\"; String fileName = "21.jpg"; response.reset(); response.setCharacterEncoding("UTF-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition","attachment;fileName=" + URLEncoder.encode(fileName,"utf-8")); File file = new File(path + fileName); FileInputStream inputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int index = 0; while ((index = inputStream.read(buffer)) != -1){ outputStream.write(buffer,0,index); outputStream.flush(); } outputStream.close(); inputStream.close(); return "forward:/UploadAndDownload.jsp"; } }
第一种上传方式:
- 获取表单的文件参数的值
- 获取文件名
- 设置存储路径
- 创建文件的输出流,文件实例的读取流
- 读取进内存,写入输出流,输出到路径位置
- 释放资源,转发回下载页面
@PostMapping("/upload") public String getUploadFile( @RequestParam("UpFile")CommonsMultipartFile file, HttpServletRequest request ) throws IOException { String fileName = file.getOriginalFilename(); System.out.println("正在检查文件,文件名称:" + fileName); String savePath = "C:\Users\Administrator\Desktop\"; System.out.println("保存路径:" + savePath); InputStream inputStream = file.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream(new File(savePath, fileName)); int len; byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer))!= -1 ){ fileOutputStream.write(buffer,0,len); fileOutputStream.flush(); } fileOutputStream.close(); inputStream.close(); request.setAttribute("UploadMessage","文件上传成功"); return "forward:/UploadAndDownload.jsp"; }
第二种上传方式:
设置好文件名和路径,直接写进去完事了
@PostMapping("/upload2") public String getUploadFile2( @RequestParam("UpFile")CommonsMultipartFile file, HttpServletRequest request ) throws IOException { String savePath = "C:\Users\Administrator\Desktop\"; System.out.println("保存路径:" + savePath); file.transferTo(new File(savePath + file.getOriginalFilename())); request.setAttribute("UploadMessage","文件上传成功"); return "forward:/UploadAndDownload.jsp"; }
下载文件
- 找到被下载的文件,路径 + 名称
- 响应头设置
- 创建读取和输出流
- 读取目标文件,写入输出流
- 响应请求
@RequestMapping("/download") public String download01( HttpServletRequest request, HttpServletResponse response ) throws Exception{ String path = "C:\Users\Administrator\Pictures\Saved Pictures\"; String fileName = "21.jpg"; response.reset(); response.setCharacterEncoding("UTF-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition","attachment;fileName=" + URLEncoder.encode(fileName,"utf-8")); File file = new File(path + fileName); FileInputStream inputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int index = 0; while ((index = inputStream.read(buffer)) != -1){ outputStream.write(buffer,0,index); outputStream.flush(); } outputStream.close(); inputStream.close(); return "forward:/UploadAndDownload.jsp"; }