SpringBoot:spring boot文件上传【多文件上传】

原文转自:http://www.vxzsk.com/638.html

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

(1)新建maven java project;

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

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

(4)编写controller;

(5)测试;

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

(7)多文件上传实现

(1)新建maven java project

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!--
        spring boot 父节点依赖,
        引入这个之后相关的引入就不需要添加version配置,
        spring boot会自动选择最合适的版本进行添加。
      -->
     < 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)新建一个表单页面(这里使用thymleaf)

在src/main/resouces新建templates(如果看过博主之前的文章,应该知道,templates是spring boot存放模板文件的路径),在templates下新建一个file.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!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方法,具体看代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package  com.kfit;
  
import  java.io.BufferedOutputStream;
import  java.io.File;
import  java.io.FileNotFoundException;
import  java.io.FileOutputStream;
import  java.io.IOException;
  
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
publicclass FileUploadController {
    
     //访问路径为:http://127.0.0.1:8080/file
     @RequestMapping ( "/file" )
     public  String file(){
        return "/file" ;
     }
    
     /**
      * 文件上传具体实现方法;
      * @param file
      * @return
      */
     @RequestMapping ( "/upload" )
     @ResponseBody
     public  String handleFileUpload( @RequestParam ( "file" )MultipartFile file){
        if (!file.isEmpty()){
            try  {
               /*
                * 这段代码执行完毕之后,图片上传到了工程的跟路径;
                * 大家自己扩散下思维,如果我们想把图片上传到 d:/files大家是否能实现呢?
                * 等等;
                * 这里只是简单一个例子,请自行参考,融入到实际中可能需要大家自己做一些思考,比如:
                * 1、文件路径;
                * 2、文件名;
                * 3、文件格式;
                * 4、文件大小的限制;
                */
               BufferedOutputStream out =  new  BufferedOutputStream( new  FileOutputStream( new  File(file.getOriginalFilename())));
               out.write(file.getBytes());
               out.flush();
               out.close();
            catch  (FileNotFoundException e) {
               e.printStackTrace();
               return "上传失败," +e.getMessage();
            catch  (IOException e) {
               e.printStackTrace();
               return "上传失败," +e.getMessage();
            }
            return "上传成功" ;
        } else {
            return "上传失败,因为文件是空的." ;
        }
     }
}

5)编写App.java然后测试

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.kfit;
  
import  org.springframework.boot.SpringApplication;
import  org.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进行编码配置:

1
2
3
4
5
6
7
8
9
10
11
@Bean 
     public  MultipartConfigElement multipartConfigElement() { 
         MultipartConfigFactory factory =  new  MultipartConfigFactory();
          设置文件大小限制 ,超了,页面会抛出异常信息,这时候就需要进行异常信息的处理了;
         factory.setMaxFileSize( "128KB" );  //KB,MB
         /// 设置总上传数据总大小
         factory.setMaxRequestSize( "256KB" ); 
         //Sets the directory location where files will be stored.
         //factory.setLocation("路径地址");
         returnfactory.createMultipartConfig(); 
     }

7)多文件上传实现

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

在src/resouces/templates/mutifile.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!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 = "/batch/upload"
            < p >文件1:< input  type = "file"  name = "file"  /></ p >
            < p >文件2:< input  type = "file"  name = "file"  /></ p >
            < p >文件3:< input  type = "file"  name = "file"  /></ p >
            < p >< input  type = "submit"  value = "上传"  /></ p >
        </ form >
     </ body >
</ html >

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
      * 多文件具体上传时间,主要是使用了MultipartHttpServletRequest和MultipartFile
      * @param request
      * @return
      */
     @RequestMapping (value= "/batch/upload" , method= RequestMethod.POST) 
     public @ResponseBody 
     String handleFileUpload(HttpServletRequest request){ 
         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 = 
                             new  BufferedOutputStream( new  FileOutputStream( new  File(file.getOriginalFilename()))); 
                     stream.write(bytes); 
                     stream.close(); 
                 catch  (Exception e) { 
                     stream =   null ;
                     return "You failed to upload "  + i +  " => "  + e.getMessage(); 
                
             else 
                 return "You failed to upload "  + i +  " because the file was empty."
            
        
         return "upload successful"
     }

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



综上以上代码应用Servlet3.0的文件上传的特性,不用引入包,我们还可以使用common-fileupload,使用旧版本的文件上传配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值