springboot文件上传下载,转载的

Spring Boot入门——文件上传与下载

原文来自:https://www.cnblogs.com/studyDetail/articles/7003253.html

1、在pom.xml文件中添加依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.wyl</groupId>

  <artifactId>SpringBootFile</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

  <name>SpringBootFile</name>

  <url>http://maven.apache.org</url>

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

      <java.version>1.7</java.version>

  </properties>

  

  <parent>

      <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>1.5.3.RELEASE</version>

  </parent>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

    

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    

    <!-- thymeleaf模板插件 -->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-thymeleaf</artifactId>

    </dependency>

    

    <!-- devtools插件,热部署 -->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-devtools</artifactId>

        <optional>true</optional>

        <scope>true</scope>

    </dependency>

    

  </dependencies>

</project>

2、application.properties文件中取消模板文件缓存

spring.thymeleaf.cache=false

3、编写模板文件

file.html

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"  

      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">

<head>

<meta charset="UTF-8" />

<title>Insert title here</title>

</head>

<body>

    <h1 th:inlines="text">文件上传</h1>

    <form action="fileUpload" method="post" enctype="multipart/form-data">

        <p>选择文件: <input type="file" name="fileName"/></p>

        <p><input type="submit" value="提交"/></p>

    </form>

</body>

</html>

multifile.html

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"  

      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">

<head>

<meta charset="UTF-8" />

<title>Insert title here</title>

</head>

<body>

    <h1 th:inlines="text">文件上传</h1>

    <form action="multifileUpload" method="post" enctype="multipart/form-data" >

        <p>选择文件1: <input type="file" name="fileName"/></p>

        <p>选择文件2: <input type="file" name="fileName"/></p>

        <p>选择文件3: <input type="file" name="fileName"/></p>

        <p><input type="submit" value="提交"/></p>

    </form>

</body>

</html>

4、编写Controller

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.multipart.MultipartFile;

@Controller

public class FileUploadController {

    /*

     * 获取file.html页面

     */

    @RequestMapping("file")

    public String file(){

        return "/file";

    }

    

    /**

     * 实现文件上传

     * */

    @RequestMapping("fileUpload")

    @ResponseBody 

    public String fileUpload(@RequestParam("fileName") MultipartFile file){

        if(file.isEmpty()){

            return "false";

        }

        String fileName = file.getOriginalFilename();

        int size = (int) file.getSize();

        System.out.println(fileName + "-->" + size);

        

        String path = "F:/test" ;

        File dest = new File(path + "/" + fileName);

        if(!dest.getParentFile().exists()){ //判断文件父目录是否存在

            dest.getParentFile().mkdir();

        }

        try {

            file.transferTo(dest); //保存文件

            return "true";

        } catch (IllegalStateException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            return "false";

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            return "false";

        }

    }

  /*

     * 获取multifile.html页面

     */

    @RequestMapping("multifile")

    public String multifile(){

        return "/multifile";

    }

    

    /**

     * 实现多文件上传

     * */

    @RequestMapping(value="multifileUpload",method=RequestMethod.POST) 

  /**public @ResponseBody String multifileUpload(@RequestParam("fileName")List<MultipartFile> files) */

    public @ResponseBody String multifileUpload(HttpServletRequest request){

        

        List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles("fileName");

        

        if(files.isEmpty()){

            return "false";

        }

        String path = "F:/test" ;

        

        for(MultipartFile file:files){

            String fileName = file.getOriginalFilename();

            int size = (int) file.getSize();

            System.out.println(fileName + "-->" + size);

            

            if(file.isEmpty()){

                return "false";

            }else{        

                File dest = new File(path + "/" + fileName);

                if(!dest.getParentFile().exists()){ //判断文件父目录是否存在

                    dest.getParentFile().mkdir();

                }

                try {

                    file.transferTo(dest);

                }catch (Exception e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                    return "false";

                } 

            }

        }

        return "true";

    }

}

5、测试

  

  

6、多文件上传中遇到的问题

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fileName exceeds its maximum permitted size of 1048576 bytes.

Spring Boot默认文件上传大小为2M,多文档上传中总是出现文件大小超出限度

解决方法:

a、在application.properties文件中设置文件大小

# Single file max size  

multipart.maxFileSize=50Mb

# All files max size  

multipart.maxRequestSize=50Mb

  但是,事实证明此种方法不能够解决以上问题

b、在启动类App.class文件中配置Bean来设置文件大小

import javax.servlet.MultipartConfigElement;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.servlet.MultipartConfigFactory;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

 * Hello world!

 *

 */

@SpringBootApplication

@Configuration

public class App 

{

    public static void main( String[] args )

    {

        System.out.println( "Hello World!" );

        SpringApplication.run(App.class, args);

    }

    

    /**  

     * 文件上传配置  

     * @return  

     */  

    @Bean  

    public MultipartConfigElement multipartConfigElement() {  

        MultipartConfigFactory factory = new MultipartConfigFactory();  

        //单个文件最大  

        factory.setMaxFileSize("10240KB"); //KB,MB  

        /// 设置总上传数据总大小  

        factory.setMaxRequestSize("102400KB");  

        return factory.createMultipartConfig();  

    }  

7、文件下载

@RequestMapping("download")

    public String downLoad(HttpServletResponse response){

        String filename="2.jpg";

        String filePath = "F:/test" ;

        File file = new File(filePath + "/" + filename);

        if(file.exists()){ //判断文件父目录是否存在

            response.setContentType("application/force-download");

            response.setHeader("Content-Disposition", "attachment;fileName=" + filename);

            

            byte[] buffer = new byte[1024];

            FileInputStream fis = null; //文件输入流

            BufferedInputStream bis = null;

            

            OutputStream os = null; //输出流

            try {

                os = response.getOutputStream();

                fis = new FileInputStream(file); 

                bis = new BufferedInputStream(fis);

                int i = bis.read(buffer);

                while(i != -1){

                    os.write(buffer);

                    i = bis.read(buffer);

                }

                

            } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            System.out.println("----------file download" + filename);

            try {

                bis.close();

                fis.close();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

        return null;

    }

标签: Spring Boot

原文地址:https://www.cnblogs.com/xiaohouzai/p/10576009.html