如何用SpringBoot框架来接收multipart/form-data文件

今天遇到一个坑,这里给大家介绍一下。

现在很多文件上传类型都是multipart/form-data类型的,HTTP请求如下所示:

可是问题就在于如果用传统的Struts2或者servlet等都可以很容易的实现文件接收的功能,例如下面的代码就可以实现:

boolean isMultipart = ServletFileUpload.isMultipartContent(request);//判断是否是表单文件类型  
DiskFileItemFactory factory = new DiskFileItemFactory();  
ServletFileUpload sfu = new ServletFileUpload(factory);  
List items = sfu.parseRequest(request);//从request得到所有上传域的列表  
for(Iterator iter = items.iterator();iter.hasNext();){  
    FileItem fileitem =(FileItem) iter.next();  
    if(!fileitem.isFormField()&&fileitem!=null){//判读不是普通表单域即是file  
        System.out.println("name:"+fileitem.getName());  
    }  
} 

可是今天我把这一段代码放在SpringBoot上面的时候就怎么也接收不到文件信息了,一直以为是前端什么数据传输错了。后来才知道原来SpringBoot有它自己的接收请求的代码。下面就给大家详细介绍一下它是如何实现这个功能的。

首选做一个简单的案例,也就是单个文件上传的案例。(这个案例是基于SpringBoot上面的,所以大家首先得搭建好SpringBoot这个框架)

前台HTML代码:

<html>  
<body>  
  <form action="/upload" method="POST" enctype="multipart/form-data">  
    <input type="file" name="file"/>  
    <input type="submit" value="Upload"/>   
  </form>  
</body>  
</html>  

后台接收代码:

/**   
     * 文件上传具体实现方法;   
     *    
     * @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())));    
                System.out.println(file.getName());  
                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 "上传失败,因为文件是空的.";    
        }    
    }    

这样就可以实现对multipart/form-data类型文件的接收了。那如果是多个文件外加多个字段呢,下面接着看下一个多个文件上传的案例。

前台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="/batch/upload">     
           <p>文件1:<input type="text" name="id" /></p>    
           <p>文件2:<input type="text" name="name" /></p>    
           <p>文件3:<input type="file" name="file" /></p>    
           <p><input type="submit" value="上传" /></p>    
       </form>    
    </body>    
</html>     

后台接收代码:

@RequestMapping(value = "/batch/upload", method = RequestMethod.POST)    
      @ResponseBody    
      public String handleFileUpload(HttpServletRequest request) {    
        MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);  
          List<MultipartFile> files = ((MultipartHttpServletRequest) request)    
                  .getFiles("file");   
          String name=params.getParameter("name");  
          System.out.println("name:"+name);  
          String id=params.getParameter("id");  
          System.out.println("id:"+id);  
          MultipartFile file = null;    
          BufferedOutputStream stream = null;    
          for (int i = 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";  
      }    

这样就可以实现对多个文件的接收了功能了。SpringBoot还可以对接收文件的格式还有个数等等进行限制,我这里就不多说了,大家有兴趣的可以自己去了解了解。

千万要记住SpringBoot对multipart/form-data类型的文件接收和其它是不一样的,大家以后遇到的时候要千万小心,不要像我一样一往无前的踩进去还傻傻的以为是前端的错误。

如果对上面的内容还有什么疑义或者问题都可以加我QQ:208017534咨询。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2822
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2936
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5607
来自专栏落花落雨不落叶

canvas画简单电路图

85811
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5478
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3015
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3308
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3007
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5248
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2900

扫码关注云+社区