优秀的编程知识分享平台

网站首页 > 技术文章 正文

SpringBoot入门-文件上传(springboot 上传文件配置)

nanyue 2024-07-29 01:09:16 技术文章 7 ℃


文件上传是每个项目都会用到的基础功能,这里讲解下实现过程和一些最佳实践


接收方式


后台如何接收前台传过来的文件呢?其实很简单,用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

?

最近发表
标签列表