29. Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】

文件上传主要分以下几个步骤

(1)新建maven java project;

(2)在pom.xml加入相应依赖;

(3)新建一个表单页面(这里使用thymeleaf);

(4)编写controller;

(5)测试;

(6)对上传的文件做一些限制;

(7)多文件上传实现

(1)新建maven java project

新建一个名称为spring-boot-fileuploadmaven java项目;

(2)在pom.xml加入相应依赖;

加入相应的maven依赖,具体看以下解释:

<!--

              springboot父节点依赖,

             引入这个之后相关的引入就不需要添加version配置,

              springboot会自动选择最合适的版本进行添加。

        -->

       <parent>

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

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

              <version>1.3.3.RELEASE</version>

       </parent>

 <dependencies>

          <!-- spring boot web支持:mvc,aop... -->

              <dependency>

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

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

              </dependency>

              <!-- thmleaf模板依赖. -->

              <dependency>

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

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

              </dependency>

 </dependencies>

     <build>

              <plugins>

                     <!-- 编译版本; -->

                     <plugin>

                            <artifactId>maven-compiler-plugin</artifactId>

                            <configuration>

                                  <source>1.8</source>

                                  <target>1.8</target>

                            </configuration>

                     </plugin>

              </plugins>

       </build>

(3)新建一个表单页面(这里使用thymeleaf)

在src/main/resouces新建templates(如果看过博主之前的文章,应该知道,templates是spring boot存放模板文件的路径),在templates下新建一个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>

       <title>Hello World!</title>

   </head>

   <body>

      <form method="POST" enctype="multipart/form-data"action="/upload"> 

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

          <p><input type="submit" value="上传" /></p>

      </form>

   </body>

</html>

(4)编写controller;

       编写controller进行测试,这里主要实现两个方法:其一就是提供访问的/file路径;其二就是提供post上传的/upload方法,具体看代码实现:

package com.kfit;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

 

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.RequestParam;

importorg.springframework.web.bind.annotation.ResponseBody;

importorg.springframework.web.multipart.MultipartFile;

 

@Controller

publicclass FileUploadController {

      

       //访问路径为:http://127.0.0.1:8080/file

       @RequestMapping("/file")

       public String file(){

              return"/file";

       }

      

       /**

        *文件上传具体实现方法;

        *@param file

        *@return

        */

       @RequestMapping("/upload")

       @ResponseBody

       public StringhandleFileUpload(@RequestParam("file")MultipartFilefile){

              if(!file.isEmpty()){

                     try {

                            /*

                             *这段代码执行完毕之后,图片上传到了工程的跟路径;

                             *大家自己扩散下思维,如果我们想把图片上传到 d:/files大家是否能实现呢?

                             *等等;

                             *这里只是简单一个例子,请自行参考,融入到实际中可能需要大家自己做一些思考,比如:

                             * 1、文件路径;

                             * 2、文件名;

                             * 3、文件格式;

                             * 4、文件大小的限制;

                             */

                            BufferedOutputStreamout =newBufferedOutputStream(new FileOutputStream(new File(file.getOriginalFilename())));

                            out.write(file.getBytes());

                            out.flush();

                            out.close();

                     }catch(FileNotFoundExceptione) {

                            e.printStackTrace();

                            return "上传失败,"+e.getMessage();

                     }catch (IOExceptione) {

                            e.printStackTrace();

                            return "上传失败,"+e.getMessage();

                     }

                     return "上传成功";

              }else{

                     return "上传失败,因为文件是空的.";

              }

       }

}






(5)编写App.java然后测试

       App.java没什么代码,就是Spring Boot的启动配置,具体如下:

package com.kfit;

 

importorg.springframework.boot.SpringApplication;

importorg.springframework.boot.autoconfigure.SpringBootApplication;

 

/**

 * Hello world!

 *

 */

//其中@SpringBootApplication申明让spring boot自动给程序进行必要的配置,等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

@SpringBootApplication

publicclass App {

       publicstaticvoid main(String[]args) {

              SpringApplication.run(App.class,args);

       }

}

然后你就可以访问:http://127.0.0.1:8080/file进行测试了,文件上传的路径是在工程的跟路径下,请刷新查看,其它的请查看代码中的注释进行自行思考。

(6)对上传的文件做一些限制;

       对文件做一些限制是有必要的,在App.java进行编码配置:

@Bean 

   public MultipartConfigElement multipartConfigElement() { 

        MultipartConfigFactoryfactory =newMultipartConfigFactory();

        设置文件大小限制 ,超了,页面会抛出异常信息,这时候就需要进行异常信息的处理了;

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

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

        factory.setMaxRequestSize("256KB"); 

        //Sets the directory location wherefiles will be stored.

        //factory.setLocation("路径地址");

        returnfactory.createMultipartConfig(); 

    } 

(7)多文件上传实现

       多文件对于前段页面比较简单,具体代码实现:

在src/resouces/templates/mutifile.html

<!DOCTYPEhtml>

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

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

   <head>

        <title>Hello World!</title>

   </head>

   <body>

      <formmethod="POST"enctype="multipart/form-data"action="/batch/upload"> 

             <p>文件1:<inputtype="file"name="file"/></p>

             <p>文件2:<inputtype="file"name="file"/></p>

             <p>文件3:<inputtype="file"name="file"/></p>

           <p><inputtype="submit"value="上传"/></p>

      </form>

   </body>

</html>

com.kfit.FileUploadController中新增两个方法:

/**

        *多文件具体上传时间,主要是使用了MultipartHttpServletRequest和MultipartFile

        *@param request

        *@return

        */

       @RequestMapping(value="/batch/upload", method=RequestMethod.POST

   public@ResponseBody 

   String handleFileUpload(HttpServletRequestrequest){ 

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

        MultipartFile file = null;

        BufferedOutputStream stream = null;

        for (inti =0;i< files.size(); ++i) { 

            file = files.get(i); 

            if (!file.isEmpty()) { 

                try

                    byte[]bytes =file.getBytes(); 

                    stream

                            newBufferedOutputStream(new FileOutputStream(new File(file.getOriginalFilename()))); 

                    stream.write(bytes); 

                    stream.close(); 

                } catch (Exceptione) { 

                       streamnull;

                    return"You failed to upload " +i + " =>" +e.getMessage(); 

                } 

            } else

                return"You failed to upload " +i + " becausethe file was empty."

            } 

        } 

        return"upload successful"

    } 

访问路径:http://127.0.0.1:8080/mutifile进行测试。


购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287