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

https://blog.csdn.net/linzhiqiang0316/article/details/77016997

****************************************************************

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

现在很多文件上传类型都是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类型的文件接收和其它是不一样的,大家以后遇到的时候要千万小心,不要像我一样一往无前的踩进去还傻傻的以为是前端的错误。

原文地址:https://www.cnblogs.com/zhao1949/p/9681701.html

时间: 2024-10-31 11:16:26

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

文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型

本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如数据结构,格式等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.适合网络传输,提供统一的方法来描述和交换应用程序的结构化数据. 2.CSV文档 CSV文档,以逗号分隔文档内容值,其文件以纯文本形式存储结构数据.CSV文

文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型

本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.Excel文档 Excel一款电子表格软件.直观的界面.出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题. 2.PDF文档 PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点.PDF文件格式可以将文字.字型.格式.颜色及独立于设备和分辨率的图形图像等封装在一个文件中.该格式文件还可以包含超文本链接.声音和动态

ASP.NET 服务端接收Multipart/form-data文件

在网络编程过程中需要向服务器上传文件. Multipart/form-data是上传文件的一种方式. 1 /// <summary> 2 /// 上传工程文件 3 /// </summary> 4 /// <returns></returns> 5 public async Task<HttpResponseMessage> UploadProjectFile() 6 { 7 ProjectFile postData = new ProjectF

golang解析http multipart/form的三种方式

multipart/form-data 顾名思义可以上传多个form-data 并且用分隔符进行分割,多用于文件上传 1. http  multipart/form-data 请求样例 POST /handle HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 182537 Cache-Control: max-age=0 Content-Type: multipart/form-data; boundary

springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据

springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据 表单html: <form class="form-horizontal form-material" th:object="${user}" th:action="@{/user/updateOneUserInfo}" method="post"> <input type="hidden

springboot框架,文件上传问题===org.springframework.web.HttpMediaTypeNotSupportedException: Content type &#39;multipart/form-data;

使用IDEA开发springboot项目,需求中要提交数据项和文件上传,同时接收实体bean对象和文件,后台Controller接收配置方式: Controller代码如下: 1 @RequestMapping(value="/comment",method = RequestMethod.POST) 2 public @ResponseBody RetResult saveIndustryComment(HttpServletRequest request,@RequestParam

spring-boot框架下的websocket服务

这几天在做web端实时展示服务端日志文件新增内容的功能.要满足实时的需求,我选择的方案是在web端跟服务端建立一个websocket链接,由服务端通过tail -f 命令将文件新增内容发送给web端. 关于websocket的介绍,可以参考这篇博文:http://www.cnblogs.com/lizhenghn/p/5155933.html(链接仅用于学习交流,如有版权问题请及时告知).这里我主要想介绍的是在spring-boot框架下如何发布websocket服务. 一.在服务端发布webs

springboot 框架 - helloword

功能:浏览器发送hello请求,服务器接收请求并处理,返回hello word字符串 一.创建一个maven项目 二.在pom.xml文件中添加依赖导入springboot框架运行需要的依赖 1 <!-- 继承了一个父项目 --> 2 <parent> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-parent</artifac

Springboot 框架学习

Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等. 简介 Spring Boot可以轻松创建单独的,基于生产级的Spring应用程序,您需要做的可能"仅仅是去运行". 我们提供了Spring Platform对Spring 框架和第三方库进行处理,尽可能的降低使用的复杂度.大多数情况下Spring Boot应用只需要非常少的配置. Fe