快捷搜索:  汽车  科技

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)); }

spring boot实现文件上传:SpringBoot入门-文件上传(1)

保存文件

接收到文件后就需要保存文件到服务器了,直接调用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); } }

spring boot实现文件上传:SpringBoot入门-文件上传(2)

保存展示

spring boot实现文件上传:SpringBoot入门-文件上传(3)

spring boot实现文件上传:SpringBoot入门-文件上传(4)

spring boot实现文件上传:SpringBoot入门-文件上传(5)

spring boot实现文件上传:SpringBoot入门-文件上传(6)

支持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()); } }

spring boot实现文件上传:SpringBoot入门-文件上传(7)

url演示

spring boot实现文件上传:SpringBoot入门-文件上传(8)

spring boot实现文件上传:SpringBoot入门-文件上传(9)

文件上传大小限制

SpringBoot默认上传文件大小限制为1MB,这个肯定不够的,需要在配置文件里改下

servlet: multipart: max-file-size: 100MB max-request-size: 100MB

spring boot实现文件上传:SpringBoot入门-文件上传(10)

参考项目(模块: SpringBoot-HelloWorld): https://gitee.com/huatin/java-test

猜您喜欢: