文件上传的业务是我们经常遇到的,那么在spring中该怎么处理这个业务呢?
文件上传三个基础
<input type="file" name="image">
enctype="multipart/form-data"
这里必须是这个类型,否则上传不了,默认的是application/x-www-form-urlencoded
只能上传文本格式的文件。不能用于发送文件action="/api/upload" method="post"
html
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
<form action="/api/upload" method="post" enctype="multipart/form-data">
<input type="text" name="name">
<input type="text" name="age">
<input type="file" name="image">
<input type="submit" value="Submit">
</form>
</body>
</html>
接口处理
java
package com.itheima.controller;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@Slf4j
@RestController
@RequestMapping("/upload")
public class UploadController {
@PostMapping
public Result upload(String name, Integer age, MultipartFile image) throws Exception {
log.info("文件上传成功 {},{},{}",name,age,image);
String originalFilename = image.getOriginalFilename();
image.transferTo(new File("D:\\360Downloads\\"+originalFilename));
return Result.success();
}
}
这样,我们就能在D:\360Downloads
中看到上传的文件了
文件名优化
如果我们直接使用上传的文件名,会导致同名的被覆盖,造成文件的丢失
java
@PostMapping
public Result upload(String name, Integer age, MultipartFile image) throws Exception {
log.info("文件上传成功 {},{},{}",name,age,image);
String originalFilename = image.getOriginalFilename();
int index = originalFilename.lastIndexOf(".");
String extname = originalFilename.substring(index);
String filename = UUID.randomUUID().toString() + extname;
image.transferTo(new File("D:\\360Downloads\\"+filename));
return Result.success();
}
java
# 配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
# 配置单个请求最大大小的限制,一次请求中是可以上传多个文件
spring.servlet.multipart.max-request-size=100MB