IOS 多文件上傳 Java web端(后台) 使用List 接收出現的問題


先上正確的示例:

  主要是設置我們的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表單再去嵌套】

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM