zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JS常见错误和分析
    angularjs 笔记(1) -- 引导
    各大浏览器hack
    AngularJS 配置和运行phonecat错误
    npm start 作用
    $.prop()和$.attr() 区别用法
    HDU 1251 统计难题 (Tire树)
    Luogu P3370 【模板】字符串哈希
    Luogu P3385 【模板】负环
    LuoguP1563 玩具谜题
  • 原文地址:https://www.cnblogs.com/bao-bei/p/13784150.html
Copyright © 2011-2022 走看看