微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift:无法使用 URLSession 上传多张图片

如何解决Swift:无法使用 URLSession 上传多张图片

我正在尝试通过 MultipartFormData

将多张图片上传到服务器

我阅读了很多链接,但无法解决我的问题。当我们上传 .jpg 或 .png 单个文件时,代码正常工作。

Postman多张图片上传成功。

核心逻辑

let boundaryPrefix = "--\(boundary)\r\n"
body.append("\(boundaryPrefix)".data(using: .utf8)!)
body.append("Content-disposition: form-data; name=\"\"; filename=\"\(listofFiles[0].name)\"\r\n".data(using: .utf8)!)
body.append("Content-Type: image/png\r\n\r\n".data(using: .utf8)!)
body.append(convertFiletoData(url: listofFiles[0].pathURL)!)
body.append("\r\n".data(using: .utf8)!)
    
body.append("\(boundaryPrefix)".data(using: .utf8)!)
body.append("Content-disposition: form-data; name=\"\"; filename=\"\(listofFiles[1].name)\"\r\n".data(using: .utf8)!)
body.append("Content-Type: image/jpg\r\n\r\n".data(using: .utf8)!)
body.append(convertFiletoData(url: listofFiles[1].pathURL)!)
body.append("\r\n".data(using: .utf8)!)
    
body.append("--".appending(boundary.appending("--")).data(using: .utf8)!)


func convertFiletoData(url: URL) -> Data? {
    do {
        let fileData = try Data(contentsOf: url)
        return fileData
    } catch {
        return nil
    }
}


session.dataTask(with: urlRequest) { (dataa,response,error) in
     if error == nil {
         if let _ = dataa {
              do {
                  let val = try JSONDecoder().decode(UploadResponse.self,from: dataa!)
              } catch {
              }
         } else {  }
     } else { }
 }.resume()

问题:

  • 只有第一个 Image 数组到达服务器。
  • 第二张图片没有到达服务器。

我犯了什么错误

解决方法

试试这个:

let boundary = "Boundary-\(UUID().uuidString)"
let boundarySuffix = "--\(boundary)--\r\n"
                
    if let images = files,images.count > 0 {
             let boundaryPrefix = "--\(boundary)\r\n"
             request?.addValue("multipart/form-data; boundary=" + boundary,forHTTPHeaderField: "Content-Type")
             let data = NSMutableData()
             if let params = parameters,params.count > 0{
                for (key,value) in params {
                    data.append("--\(boundary)\r\n".nsdata)
                    data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".nsdata)
                    data.append("\((value as AnyObject).description ?? "")\r\n".nsdata)
                 }
              }
              for file in images {
                  data.append(boundaryPrefix.nsdata)
                  data.append("Content-Disposition: form-data; name=\"\(file.name!)\"; filename=\"\(NSString(string: file.filename!))\"\r\n\r\n".nsdata)
                   if let a = file.data {
                      data.append(a)
                      data.append("\r\n".nsdata)
                   } else {
                      print("Could not read file data")
                   }
               }
               data.append(boundarySuffix.nsdata)
               request?.httpBody = data as Data
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?