前言
文件上传是在开发中比较常用的一个功能,用户可以通过上传接口将图片、视频、音频或其他类型的文件上传到服务器存储,那在springboot中也可以实现一个文件上传的接口,接下来,我将编写一个最简单的文件上传接口。
实现步骤
1.安装maven相关依赖
此功能用到了hutool中的FileUtil类,所以需要在maven中获取依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.3</version>
</dependency>
2.定义存储路径
我们可以在application.yaml配置文件定义一个文件存储路径的值,这样就可以通过@Value注解去获取到路径,例如我想将文件存储在项目文件夹下的uploads文件夹,就可以直接写相对路径
然后通过@Value获取值
@Value("${files.upload.path}")
private String uploadPath;
3.编写接口
最后可以编写接口,以下是源码,文件通过MultipartFile接收文件参数,接收后获取文件名和文件后缀,将文件名用UUID重命名后重新拼接,最后与上传路径拼接,将文件写入,写入后将文件路径返回给前端。
import cn.hutool.core.io.FileUtil;
import com.example.bookjava.exception.CusException;
import org.springframework.beans.factory.annotation.Value;
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.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.rmi.AccessException;
import java.util.UUID;
@RestController
@RequestMapping("/upload")
public class UploadController {
@Value("${files.upload.path}")
private String uploadPath;
@PostMapping("/file")
public String upload(@RequestParam MultipartFile file) throws IOException {
try {
// 获取上传文件的原始文件名
String fileName = file.getOriginalFilename();
//重命名文件
String saveFileName = UUID.randomUUID().toString() + '.' + FileUtil.extName(fileName);
// 构造文件保存的路径
String filePath = Paths.get(uploadPath, saveFileName).toString();
// 获取上传目录的绝对路径
Path absolutePath = Paths.get(uploadPath).toAbsolutePath();
// 构造文件的绝对路径
String absoluteFilePath = Paths.get(absolutePath.toString(), saveFileName).toString();
// 将上传的文件传输到指定位置
file.transferTo(new File(absoluteFilePath));
// 返回文件保存的路径
return filePath;
} catch (IOException e) {
throw new AccessException(e.getMessage());
}
}
}
测试
最后,启动项目,测试接口,我这边就通过apifox测试接口。
上传成功,返回了文件路径,文件也存储到了uploads文件夹中。
附加
文件上传后,我们也可以通过application.yaml文件来配置静态资源访问,例如要项目文件夹下uploads文件夹下的所有资源,配置如下。
spring:
web:
resources:
static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,file:uploads
mvc:
static-path-pattern: /uploads/**
这样就可以通过后端地址+文件路径的方式在浏览器访问上传的文件。