• spring-boot-route 实现多文件上传


    Spring Boot默认上传的单个文件大小1MB,一次上传的总文件大小为10MB

    单个文件上传使用MultipartFile参数来接收文件,多文件使用MultipartFile[]数组来接收,然后遍历它,当成单文件来处理。

    问题一:如何配置上传文件大小限制?

    @Configuration
    public class FileConfig implements WebMvcConfigurer {
        @Bean
        public MultipartConfigElement multipartConfigElement(){
            MultipartConfigFactory factory = new MultipartConfigFactory();
            // 单个文件大小
            factory.setMaxFileSize(DataSize.parse("10240MB"));
            // 上传的总文件大小
            factory.setMaxRequestSize(DataSize.parse("20480MB"));
            return factory.createMultipartConfig();
        }
    }
    

    思考:SpringBoot项目推荐使用jar包的方式来运行项目,而实际应用中我们也发现jar包运行项目更加方便。但是当打完jar包后,这个jar的大小就固定好了,上传的文件肯定传不到jar包里面了。SpringBoot提供了一种方式,将文件上传到服务器物理路径下,然后做个映射关系,让图片可以正常被访问,具体操作如下:

    @Configuration
    public class FileConfig implements WebMvcConfigurer {
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/static/**").addResourceLocations("file:"+"D://uploadfile/");
        }
    }
    

    addResourceHandler("/static/**")表示访问路径为/static/文件名,addResourceLocations("file:"+"D://uploadfile/")表示文件存储的物理路径,"file:"为固定写法。

    文件上传后台实现

    @RestController
    @Slf4j
    public class FileUpload {
    
        @PostMapping("uploadFile")
        public List uploadFile(@RequestParam("files") MultipartFile[] files) {
    
            // 存储上传成功的文件名,响应给客户端
            List<String> list = new ArrayList<>();
            // 判断文件数组长度
            if(files.length <= 0){
                list.add("请选择文件");
                return list;
            }
            for(MultipartFile file : files){
                // 源文件名
                String originalFilename = file.getOriginalFilename();
                // 文件格式
                String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
                // 新文件名,避免文件名重复,造成文件替换问题
                String fileName = UUID.randomUUID()+"."+suffix;
                // 文件存储路径
                String filePath = "D:/uploadFile/";
                // 文件全路径
                File targetFile = new File(filePath+fileName);
    
                // 判断文件存储目录是否存在,不存在则新建目录
                if(!targetFile.getParentFile().exists()){
                    targetFile.getParentFile().mkdir();
                }
                try {
                    // 将图片保存
                    file.transferTo(targetFile);
                    list.add(originalFilename);
                } catch (IOException e) {
                    log.info("文件上传异常={}",e);
                }
            }
            return list;
        }
    }
    

    静态资源问题

    SpringBoot静态资源默认路径为:classpath:/META-INF/resources/ ,classpath:/resources/classpath:/static/classpath:/public/。也就是说如果想访问静态资源,则需要将静态资源 文件放在这四个路径下面。

    注:classpath 指的是 SpringBoot项目resources

    如果想自定义静态资源路径有两种方式,

    application.yml中指定

    spring:
      resources:
        static-locations: classpath:/templates/
    

    代码实现WebMvcConfigurer

    @Configuration
    public class FileConfig implements WebMvcConfigurer {
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/");
        }
    

    注:当配置了自定义静态资源路径后,其默认配置将失效

    文件上传前端实现

    在静态资源路径下,新建file.html文件,浏览器访问ip:port/file.html,进入file页面

    <form enctype="multipart/form-data" method="post" action="/uploadFile">
        文件:<input type="file" name="files"/>
        <input type="submit" value="上传"/>
    </form>
    

    这里需要注意的是文件上传表单的enctype为multipart/form-data

  • 相关阅读:
    Windows Mobile 开发资源 [转]
    CIO与CTO的区别
    [转]快速产品开发的12项指南
    VS Template Parameters
    MSDN Webcast 使用Windows Mobile Test Framework进行自动化测试(Level 300)
    10年内两类必被淘汰的企业软件开发公司(转载)
    小学期第二周收获
    对于学长创作的软件 TD信息通(无课表)的使用体验以及改进内容
    小学期第一周收获
    Delphi中建议使用的语句
  • 原文地址:https://www.cnblogs.com/bao-bei/p/13784150.html
Copyright © 2020-2023  润新知