spring boot实现文件上传:SpringBoot入门-文件上传
spring boot实现文件上传:SpringBoot入门-文件上传public String upload(MultipartFile file) { try { //获取原始文件名 String originalName = file.getOriginalFilename(); //获取原始文件后缀 String extension = FileUtils.getExtention(originalName); //生成新的文件名,保留原有后缀 String fileName = UUIDUtils.getUUID() "." extension; int pathCode = RandomUtils.nextInt(65535); //取低位1字节 int v = path
文件上传是每个项目都会用到的基础功能,这里讲解下实现过程和一些最佳实践
接收方式后台如何接收前台传过来的文件呢?其实很简单,用MultipartFile就能接收
@PostMapping("file")
@ApiOperation(value = "上传文件")
public Result uploadFile(@RequestParam("file") MultipartFile file) {
return resultOk(uploadService.upload(file));
}
接收到文件后就需要保存文件到服务器了,直接调用MultipartFile的transferTo方法就能保存,没啥难度,关键是如果指定保存目录。很多人喜欢用当前日期来生成目录保存文件,比如生成一个名为20210810的目录。这种方式有个不好的地方就是文件不均衡,可能有的目录有很多文件,有的目录却没有文件。
一个目录放入太多文件会造成检索缓慢,我们生活中应该有这样的经验,当打开一个文件超多的目录鼠标会显示加载中,过好一会才能看到文件。
那如何才能均衡的存放文件呢?
可以随机生成一个2字节整数 16进制最小为0x0000 最大为0xFFFF 可以把低位作为一级文件名,高位作为二级文件名,比如文件名为ff/ff 这样如果每个文件夹保存256个文件的话,理论可以均衡保存1600万个文件。
如果想均衡保存更多文件咋办?那就取4字节,最大为0xFFFFFFFF 生成4层目录,可均衡保存万亿个文件。当然这么大数量的文件已经不推荐单机保存了,需要考虑HDFS或者OSS。
public String upload(MultipartFile file) {
try {
//获取原始文件名
String originalName = file.getOriginalFilename();
//获取原始文件后缀
String extension = FileUtils.getExtention(originalName);
//生成新的文件名,保留原有后缀
String fileName = UUIDUtils.getUUID() "." extension;
int pathCode = RandomUtils.nextInt(65535);
//取低位1字节
int v = pathCode & 0xFF;
//取次低位1字节
int h = pathCode >> 8 & 0xFF;
String relativeDir = HexUtils.bytesToHexString((byte) v).toLowerCase() "/" HexUtils.bytesToHexString((byte) h).toLowerCase() "/";
File dir = new File(systemConfig.getUploadPath() relativeDir);
if (!dir.exists()) {
dir.mkdirs();
}
File saveFile = new File(dir fileName);
file.transferTo(saveFile);
return systemConfig.getFileBaseUrl() "file/" relativeDir fileName;
} catch (IOException e) {
throw new ServiceFailException("上传文件失败" e);
}
}
保存展示
支持URL访问这个时候虽然保存成功了,但是无法通过URL访问,因为没建立资源的映射关系 下面的uploadPath是本地文件保存路径
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private SystemConfig systemConfig;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//定义静态资源路径
registry.addResourceHandler("/file/**").addResourceLocations("file:" systemConfig.getUploadPath());
}
}
url演示
文件上传大小限制SpringBoot默认上传文件大小限制为1MB,这个肯定不够的,需要在配置文件里改下
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
参考项目(模块: SpringBoot-HelloWorld): https://gitee.com/huatin/java-test