MultipartFile上传文件的几种场景

前言:

     1:什么是MultipartFile

                 MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。

     2:什么是transferTo

                 使用transferTo (本质上还是使用了流 只不过是封装了步骤)
                 会生成文件,最后不需要文件要删除

正文:

          针对文件上传笔者在这里列举了三种情况,前后端主要是java和js

          后端applicationContext.xml配置

         

         (注:如果多文件较大,定义CommonsMultipartResolver,不要指定上传的文件大小)

 

一:基于表单的MultipartFile 单文件上传

     前端:jsp

   

           

           

           

           

           

           

 

   

 后端java代码

 @RequestMapping(value="uploadFile",method={RequestMethod.POST})

 

 

      public String UploadingVideo2(

      @RequestParam(value = "videoUpload", required = false) MultipartFile file

       ) throws IOException{             

              String MD5File = UUID.randomUUID() + file.getOriginalFilename();// 对文件进行加密处理
              String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/photo");//文件存储路径
              file.transferTo(new File(filePath+ File.separator + MD5File));  //进行写入文件

                       return "redirect:/SpringMVC/videoUploadSuc";           //表单提交结束重定向

        }

 

二:基于ajax的MultipartFile 单文件上传

    前端完整jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>

     

         

         

     

//注:这里主要传输的是单个对象文件,多对象文件传输可能出现IllegalStateException异常

//1:多个文件内存之和小于3MB,不会出现此异常,因为它太小,Spring将其保存在内存中,

        当我们请求文件时,它会从内存中检索。我们可以多次请求它,因为文件在内存中。

//2:多个文件内存之和大于3MB,报IllegalStateException异常

        Spring将把它保存为一个临时文件,我们不知道它的位置,但是当我们读取输入流之后,

        这个文件可能会被Spring内部删除。然后,当我们要求第二次,错误说“不能再读”。

 

 

后端java代码

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

@ResponseBody

public JSONObject fileUpload(

@RequestParam("file_data") MultipartFile file_data, @RequestParam("type") String type){

              String MD5File = UUID.randomUUID() + file.getOriginalFilename();// 对文件进行加密处理
              String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/photo");//文件存储路径
              file.transferTo(new File(filePath+ File.separator + MD5File));  //进行写入文件

}

 

三:基于ajax的MultipartFile 多文件上传

前端完整jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

     

           

           

           

           

           

         

     

 

//注:1:在js中 formData.append(key,value),相同的key是不会覆盖的,而是作为一个数组

              这里根据传输的文件属于几个类别,定义几个数组,这里定义了multipartFile1、multipartFile2

//         2:在多文件上传时,后端只能以数组进行接收文件,

               要是一个个文件的形式传输到后端,只要有一个空文件,后端则全部数据都无法接收到。

 

java代码

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

public void filesUpload(

@RequestParam("multipartFile1") MultipartFile[] multipartFile1,

@RequestParam("multipartFile2") MultipartFile[] multipartFile2) {

        for (MultipartFile multipartFile : multipartFile1) {

                   saveFile(multipartFile);

        }

       for (MultipartFile multipartFile : multipartFile2) {

                  saveFile(multipartFile);

        }

}

 

private boolean saveFile(MultipartFile file) {

        // 判断文件是否为空

       if (!file.isEmpty()) {

             try {

                     String MD5File = UUID.randomUUID() + file.getOriginalFilename();// 对文件进行加密处理

                     String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/photo");

                     file.transferTo(new File(filePath+ File.separator + MD5File));

                     return true;

              } catch (Exception e) {

                      e.printStackTrace();

              }

       }

           return false;

  }

注: 这里request需要在当前类中自动注解导入

        @Autowired

         private HttpServletRequest request;

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(MultipartFile上传文件的几种场景)