IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题

先上正确的示例:

主要是设置我们的request的content-type为multipart/form-data

NSDictionary *param = @{@"assignee"     :self.userId,
                            @"projectName"  :itemName.text,
                            @"proceedingName":Name.text,
                            @"content"      :content.text,
                            @"urgency"      :string
                            };
    BaseNetwork *net = [BaseNetwork new];
    [net.httpSessionManager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
    [net uploadImageRequestURL:[NSString stringWithFormat:@"%@act/proceeding/start", GW_Domain] imageArray:self.imageArray parameters:param progress:^(float progress) {

其次是,将我们获取的imageArray(文件集合)按照web端(后台)的key约定,组装。【我们Java 后台的文件集合声明的key名称是files】

------至此,ios这边的代码就结束了。

Java后台:

controller层

  /**
   * 发起申请(app)
   *
   * @param proceeding
   * @return
   */
  @ResponseBody
  @RequestMapping("/start")
  // @RequiresPermissions("act:proceeding:apply")
  public R start(Proceeding proceeding) {
    try {
      // 启动事项审批工作流程
      proceedingService.appStartProcess(proceeding, getUser());
      return R.ok();
    } catch (BDException e) {
      LOGGER.error("app端发起事项审批流程异常", e);
      return R.error(e.getMessage());
    } catch (Exception e) {
      LOGGER.error("app端发起事项审批流程异常", e);
      return R.error();
    }
  }
Proceeding 载体bean
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import com.shengshi.common.domain.UploadFileDO;
import com.shengshi.common.exception.FileException;
import com.shengshi.common.utils.Base64Utils;

public class Proceeding implements Serializable {

  private static final long serialVersionUID = 1L;

  /**
   * 主键UUID
   */
  private String id;

  /**
   * 事项审批申请人
   */
  private Long userId;

  /**
   * 项目名称
   */
  private String projectName;

  /**
   * 事项名称
   */
  private String proceedingName;

  /**
   * 事项内容
   */
  private String content;

  /**
   * 缓急程度 0:常规 1:紧急 2:特级
   */
  private String urgency;

  /**
   * 创建时间
   */
  private Date createTime;

  /**
   * 事项审批状态 0:录入 1:审核中 2:审核通过 3:审核不通过
   */
  private String status;

  /**
   * 事项审批流程实例ID
   */
  private String procInstId;

  /**
   * 任务指定处理人
   */
  private String assignee;

  /**
   * 任务发起时间
   */
  private Date applyTime;

  /**
   * 上传文件列表,之所以没有规范为multipartfile是在get方法做了另外封装【要兼容移动端和app】
   */
  private List<Object> files;

  /**
   * 关联文件,多个用逗号分隔
   */
  private String delIds;

  /**
   * 上传文件记录列表
   */
  private List<UploadFileDO> uploadFileList;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public Long getUserId() {
    return userId;
  }

  public void setUserId(Long userId) {
    this.userId = userId;
  }

  public String getProjectName() {
    return projectName;
  }

  public void setProjectName(String projectName) {
    this.projectName = projectName;
  }

  public String getProceedingName() {
    return proceedingName;
  }

  public void setProceedingName(String proceedingName) {
    this.proceedingName = proceedingName;
  }

  public String getContent() {
    return content;
  }

  public void setContent(String content) {
    this.content = content;
  }

  public String getUrgency() {
    return urgency;
  }

  public void setUrgency(String urgency) {
    this.urgency = urgency;
  }

  public Date getCreateTime() {
    return createTime;
  }

  public void setCreateTime(Date createTime) {
    this.createTime = createTime;
  }

  public String getStatus() {
    return status;
  }

  public void setStatus(String status) {
    this.status = status;
  }

  public String getProcInstId() {
    return procInstId;
  }

  public void setProcInstId(String procInstId) {
    this.procInstId = procInstId;
  }

  public String getAssignee() {
    return assignee;
  }

  public void setAssignee(String assignee) {
    this.assignee = assignee;
  }

  public Date getApplyTime() {
    return applyTime;
  }

  public void setApplyTime(Date applyTime) {
    this.applyTime = applyTime;
  }

  public List<Object> getFiles() {
    return files;
  }

  public void setFiles(List<Object> files) {
    this.files = files;
  }

 //之所以封装这个方法,是因为我们需要兼容app(直接form表单提交,文件类型)和h5移动端(将文件用base64 encode一下,以字符串的形式传输)的文件上传
  public List<MultipartFile> getFileList() throws FileException {
    List<MultipartFile> list = new ArrayList<MultipartFile>();
    if (files == null) {
      return list;
    }
    for (Object obj : files) {
      if (obj instanceof MultipartFile) {
        list.add((MultipartFile) obj);
      } else {// 移动app的from提交,文件为base64字符串
        // 截取文件字符串 获取文件的类型和内容 base64文件的形式
        // “data:image/jpeg;base64,kjkjfkj4k5j43kj34j34kj534k5j43j34kj5k34j5534kj5534j4”
        // 这里再说明一下,如果将来对接android图片上传也采取base64方式的时候,
        // 有可能解析文件不全,因为Java后台默认会把“+”(加号)替换成“ ”空格,接收的时候先把空格全部替换成“+”
        String base64Img = obj.toString();
        list.add(Base64Utils.base64ConvertFile(base64Img));
      }
    }
    return list;
  }

  public String getDelIds() {
    return delIds;
  }

  public void setDelIds(String delIds) {
    this.delIds = delIds;
  }

  public List<UploadFileDO> getUploadFileList() {
    return uploadFileList;
  }

  public void setUploadFileList(List<UploadFileDO> uploadFileList) {
    this.uploadFileList = uploadFileList;
  }

}

------正确示例到此结束

我们出现的问题就是,ios端不小心将文件参数多封装了一层,如下:

NSDictionary *param = @{@"assignee"     :self.userId,
                            @"projectName"  :itemName.text,
                            @"proceedingName":Name.text,
                            @"content"      :content.text,
                            @"urgency"      :string,                 @"files"        :data
                            };
    BaseNetwork *net = [BaseNetwork new];
    [net.httpSessionManager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
    [net uploadImageRequestURL:[NSString stringWithFormat:@"%@act/proceeding/start", GW_Domain] imageArray:self.imageArray parameters:param progress:^(float progress) {

就是这个多给的参数,【files】. 后台得到的等于是key:files value:formdata。   本来要的是文件的格式,因为疏忽,导致后台一直按照字符串解析,匹配不成文件类型。记录一下。【本文图一已经对imageArray便利处理时加了相应的key,所以无需在form表单再去嵌套】

 

原文地址:https://www.cnblogs.com/ANCAN-RAY/p/8708299.html

时间: 2024-08-23 06:04:10

IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题的相关文章

文件上传(java web)

文件上传: 对表单的要求: * method="post" * enctype="multipart/form-data" * 表单中需要添加文件表单项:<input type="file" name="xxx" /> 对Servlet的要求: * request.getParametere("xxx");这个方法在表单为enctype="multipart/form-data&quo

[转]文件上传原理:Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的CommonsFileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了CommonsFileUpload).在asp.net中也有相应的上传文件的控件. 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件

【iOS】文件上传小记

iOS中用系统提供的API能实现能实现文件的上传与下载,分别有两种方式.NSURLConnection与NSURLSession. 其中NSURLConnection是使用很久的的一种方式,NSURLSession是新出来的一种方式. 一. POST方式上传 POST方式提交信息默认使用的是 : *Content-Type:  application/x-www-form-urlencoded. *输入中文时,post方式自动进行转义(苹果中自动). 国内的绝大多数网站都采用这种方式上传文件(支

记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化

最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rfc1867标注来的, 只是分段上传需要在前端多做点事情.分段上传原理其实就是在前端使用JavaScript对文件进行分割成不同小块,然后每次ajax请求就post一小块,直到全部收到为止. 但是,为了确保后端能判断文件是否完整的收到,需要得知当前是第几块,一共多少块,每个分段的大小是多少(前后端同学

前后端分离跨服务器文件上传-Java SpringMVC版

近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一份Tomcat,用来作为文件服务器 1.1 xml文件: 需要在该Tomcat的conf目录下的web.xml文件的大概100行添加如下部分: 1.2 server.xml文件: 需要在该Tomcat的conf目录下的server.xml文件做一些端口的修改 1.3 Tomcat下建立文件夹 在该T

jquery-ajax实现文件上传异常处理web.multipart.MultipartException

异常如下: org.springframework.web.multipart.MultipartException: The current request is not a multipart request 原因分析: 可能原因1: form表单中没有添加 enctype="multipart/form-data" 属性 可能原因2: 请求方式必须为post,如果不是则必定出错 可能原因3: 请求的contentType不是"multipart/form-data&qu

iOS开发-文件上传原理

文件上传 编写文件上传类UploadFile.h // // UploadFile.h // 02.Post上传 // // Created by wyh on 15-1-29. // Copyright (c) 2015年 itcast. All rights reserved. // #import <Foundation/Foundation.h> @interface UploadFile : NSObject - (void)uploadFileWithURL:(NSURL *)ur

以调用接口的方式将文件上传至Web服务器

前台代码: <form id="form1" action="http://www.abc.com/data/UploadFile.aspx" method="post" enctype="multipart/form-data" > <input type="file" name="F" style="width:160px;" /> <

Selenium的文件上传JAVA脚本

在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = driver.findElement(By.xpath("//input[@type='file']")); 2. 上传操作 String filePath ="D:\\taxonomy\\DB\\HaierTaxonomy.xlsx"; adFileUpload.sendKey