【问题标题】:How to upload array or list of files (images) with Alamofire如何使用 Alamofire 上传数组或文件列表(图像)
【发布时间】:2018-09-11 10:53:34
【问题描述】:

我正在使用以下代码将图像上传到服务器,它工作正常,但我需要根据一个参数(即“hunter_pictures”)上传图像数组或列表

Alamofire.upload(multipartFormData: { multipartFormData in  
   multipartFormData.append(UIImageJPEGRepresentation(spottingImage, 1)! , withName: "hunt_pictures", fileName: "user.jpg", mimeType: "image/jpeg")
   multipartFormData.append((userID.data(using: String.Encoding.utf8, allowLossyConversion: false))!, withName: "user_id")
                  },
                             to: url,
                            encodingCompletion: { encodingResult in
                                switch encodingResult {
                                case .success(let upload, _, _):

                                case .failure(let encodingError):
                                    print(encodingError)

                                }
                        })

【问题讨论】:

    标签: swift alamofire multipartform-data


    【解决方案1】:

    试试这个方法:

    func uploadImages(pictures: [UIImage]) {
    
        let url = "your url"
        let headers: HTTPHeaders = [Keys.authorization: "your token"]
    
        Alamofire.upload(multipartFormData: { (multipartFormData) in
    
            for image in pictures {
                if let imageData = UIImageJPEGRepresentation(image, 1) {
                    multipartFormData.append(imageData, withName: "pictures[\(index)]", fileName: "picture", mimeType: "image/jpeg")
                }
            }
    
        }, to: url, method: .post, headers: headers) { (encodingResult) in
    
            switch encodingResult {
    
            case .success(let upload, _, _):
                upload.responseJSON { (response) in
    
                    let json = response.result.value
                    print(json)
                }
    
            case .failure(let encodingError):
                print(encodingError.localizedDescription)
            }
        }
    }
    

    【讨论】:

    • 供未来读者使用的 UIImageJPEGRepresentation 已替换为实例方法 UIImage.jpegData(compressionQuality:)'
    【解决方案2】:

    @maxwel 的回答只进行了一项修改,只需在文件名“hunter_picture.jpg”中添加文件格式。添加了 .jpg 并且它起作用了

    Alamofire.upload(
        multipartFormData: { multipartFormData in
        multipartFormData.append((userId.data(using: String.Encoding.utf8, allowLossyConversion: false))!, withName: "userID")
    
           for (index,image) in self.spottingImages.enumerated() {
              if let imageData = UIImageJPEGRepresentation(image, 1) {
                multipartFormData.append(imageData, withName: "hunter_picture[\(index)]", fileName: "hunter_picture.jpg", mimeType: "image/jpeg")  }
                                        }
        },
                    to: url,
                    encodingCompletion: { encodingResult in
                        switch encodingResult {
                        case .success(let upload, _, _):
                            print(upload)
                        case .failure(let encodingError):
                            print(encodingError)}
                })
    

    【讨论】:

      【解决方案3】:

      整合多张图片上传的步骤:

      1. 将图像数组和参数作为函数参数发送,并带有成功和失败闭包。

      2. 将图像和参数附加到multipartFormData

      3. 在各自的闭包中返回success/failure

      代码片段:

      func callAPIForImagesUpload(images: [UIImage],
                                  parameters:[String: String]?,
                                  success:@escaping ((_ response: Any?) -> Void),
                                  failure:@escaping ((_ error: Error?) -> Void)) {
          let apiURL = "xyz/"
          let requestHeaders: HTTPHeaders = ["Authorization": "token value"]
          let fileName = "user" // This will be the parameter name in which server is expecting the image data
      
          Alamofire.upload(multipartFormData: { multipartFormData in
      
              for i in 0..<images.count {
                  if let imageData = UIImageJPEGRepresentation(images[i], 1) {
                      multipartFormData.append(imageData, withName: "image_" + "\(i)", fileName: fileName, mimeType: "image/jpeg")
                  }
              }
      
              // Append parametrs too, if any
              let params = parameters ?? [String: String]()
              for (key, value) in params {
                  // Appending parameters in the request
                  multipartFormData.append((value.data(using: .utf8))!, withName: key)
              }
      
          }, to: apiURL, method: .post, headers: requestHeaders) { encodingResult in
      
              switch encodingResult {
              case .success(let upload, _, _):
                  // Check whether status code lie between `200-300` range; mostly it would be `200`
                  upload.validate(statusCode: 200..<300).responseJSON(completionHandler: { receivedInfo in
                      print("Success: \(receivedInfo.result.value ?? "error occurred in response value")")
                      success(receivedInfo.result.value)
                  })
              case .failure(let error):
                  print("Error: \(error.localizedDescription)")
                  failure(error)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-26
        • 2017-08-15
        • 1970-01-01
        • 1970-01-01
        • 2017-06-19
        • 1970-01-01
        • 2018-11-09
        • 2016-12-19
        相关资源
        最近更新 更多