1、文件上传
从浏览器向客户端上传的过程
1.1表单准备
<form th:action="@{/fileup}" method="post" enctype="multipart/form-data">
文件上传:<input type="file" name="fileName"><br>
<input type="submit" value="上传">
</form>
- POST请求
- 必须设置 表单属性enctype=“multipart/form-data” 默认是
application/x-www-form-urlencoded
web.xml中配置
Spring6
需要进行此配置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!--设置单个支持最大文件的大小-->
<max-file-size>102400</max-file-size>
<!--设置整个表单所有文件上传的最大值-->
<max-request-size>1024000</max-request-size>
<!--设置最小上传文件大小-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
1.2 控制器代码
@PostMapping("/fileup")
@ResponseBody
public String fileUp(@RequestParam("fileName") MultipartFile multipartFile,
HttpServletRequest request) throws IOException {
String name = multipartFile.getName(); // 获取的是参数的名字 fileName
String originalFilename = multipartFile.getOriginalFilename(); // 获取的是文件真实的名字
// 输入流
InputStream in = multipartFile.getInputStream(); // 输入流,负责读客服端的文件
BufferedInputStream bis = new BufferedInputStream(in);
// 输出流
ServletContext application = request.getServletContext();
String realPath = application.getRealPath("/upload");
File file = new File(realPath);
System.out.println(realPath);
if (!file.exists()){
file.mkdirs();
}
File destFile = new File(file.getAbsolutePath() + "/" + UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
// 一边读一边写
byte [] bytes = new byte[1024 * 10];
int readCount = 0;
while ((readCount = bis.read(bytes)) != -1){
bos.write(bytes,0,readCount);
}
bos.flush();
bos.close();
bis.close();
}
2. 文件下载
2.1 下载链接
<a th:href="@{/download}">文件下载</a>
2.1 对应控制器
@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile(HttpServletResponse response, HttpServletRequest request) throws IOException {
File file = new File(request.getServletContext().getRealPath("/upload") + "/avatar2.jpg");
// 创建响应头对象
HttpHeaders headers = new HttpHeaders();
// 设置响应内容类型
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 设置下载文件的名称
headers.setContentDispositionFormData("attachment", file.getName());
// 下载文件
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(Files.readAllBytes(file.toPath()), headers, HttpStatus.OK);
return entity;
}