springboot 幾種文件上傳方式


  基於springboot 2.3.4.RELEASE。 pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>            

  提交配置屬注意項:1、POST提交; 2、enctype="multipart/form-data"

 

第一種:使用spring的 MultipartFile 接口來接收

<form action="/file/upload1" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="上傳"/>
</form>
    @RequestMapping(value = " file/upload1")
    public String  fileUpload1(@RequestParam("file") MultipartFile file) throws IOException {
        String path=uploadPath+ File.separator + "upload1" + File.separator +file.getOriginalFilename();        

        File destination = new File(path);
        if (!destination.getParentFile().exists()){
            FileUtils.forceMkdirParent(destination); //使用commons-io的工具類
        }
        file.transferTo(destination);
        return "success:" + path;
    }

  默認文件大小在1MB, 可以使用配置文件application.yml進行調節:

spring:
  servlet:
    multipart:
      max-file-size: 10MB  #每個文件大小
      max-request-size: 30MB  #請求上傳文件總量

 

第二種,使用具體實現類CommonsMultipartFile。 如果參數過多也可以封裝成對象進行傳遞

public class UploadParam {
    private int tradeDate;
    private CommonsMultipartFile file;
    //省略set get
}

前端html的寫法與第一種無異。

    @RequestMapping("upload2")
    public String  fileUpload2(UploadParam param) throws IOException {
        String file = uploadPath + File.separator + "upload2" + File.separator + param.getFile().getOriginalFilename();
        File destination = new File(file);
        if (!destination.getParentFile().exists()){
            FileUtils.forceMkdirParent(destination);
        }
        param.getFile().transferTo(destination);
        return "success: " + file;
    }

 

第三種,多文件上傳。參數屬性名一樣即可。

public class MultiFileParam {

    private int tradeDate;
    private List<CommonsMultipartFile> file;
    //省略set get 
}
    @RequestMapping("upload3")
    public String  fileUpload3(MultiFileParam param) throws IOException {
        String file = uploadPath + File.separator + "upload3" ;
        File destination = new File(file);
        if (!destination.exists()){
            FileUtils.forceMkdirParent(destination);
        }

        param.getFile().forEach(f->{
            File dest = new File(file + File.separator + f.getOriginalFilename());
            try {
                f.transferTo(dest);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

        return "success: " + file;
    }

 

<form action="/upload3" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="file" name="file"/>
    <input type="submit" value="上傳"/>
</form>

 

常見異常及處理:

1、fileupload.impl.FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

超過默認大小。通過配置文件調節即可。

spring.servlet.multipart.max-file-size=30Mb

spring.servlet.multipart.max-request-size=30Mb

 

2、java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException。缺少依賴包

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

 

3、'org.springframework.web.multipart.commons.CommonsMultipartFile' for property 'file'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'org.springframework.web.multipart.commons.CommonsMultipartFile' for property 'file': no matching editors or conversion strategy found] 使用實現類,必需實例加載

    @Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setDefaultEncoding("UTF-8");
        multipartResolver.setMaxInMemorySize(10*1024*1024);
        multipartResolver.setMaxUploadSize(30*1024*1024);

        return multipartResolver;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM