【问题标题】:Upload multiple images in swift using Alamofire使用 Alamofire 快速上传多张图片
【发布时间】:2017-05-20 20:47:05
【问题描述】:

我正在使用以下代码将单个图像上传到服务器:

private static func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData?, imageName: String) -> (URLRequestConvertible , NSData) {

    // create url request to send
    let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
    let boundaryConstant = "myRandomBoundary12345";
    let contentType = "multipart/form-data;boundary="+boundaryConstant
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")


    // create upload data to send
    let uploadData = NSMutableData()
    if(imageData != nil && imageData?.length != 0) {
        // add image
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(StringHelper.sharedInstance.randomString(5)).png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData(imageData!)
    }
    // add parameters
    for (key, value) in parameters {
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    print("upload",parameters)
    // return URLRequestConvertible and NSData
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}

如何通过编辑此代码以单个参数上传多张图片?

【问题讨论】:

  • 如何在一个参数中上传多个图像数组
  • 您可以创建一个包含所有 func 参数的结构,然后创建一个包含这些结构的数组的函数,然后在函数中您可以遍历数组,然后返回一个请求数组.如果您想一次完成所有操作,因为您需要在所有上传完成后执行某些操作,请查看操作队列或调度组

标签: ios swift alamofire image-uploading


【解决方案1】:

斯威夫特 3 只需使用“[]”和图像上传参数来使其成为图像数组。

Alamofire.upload(multipartFormData: { multipartFormData in
            // import image to request
            for imageData in imagesData {
                multipartFormData.append(imageData, withName: "\(imageParamName)[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg")
            }
            for (key, value) in parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to: urlString,

            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in

                    }
                case .failure(let error):
                    print(error)
                }

        })

【讨论】:

  • 上传多张图片的简单方法,谢谢
  • 以上代码是上传多张图片集合,根据代码你有图片数据(Foundation.Data)在imagesData数组中。问题是它在使用迭代创建 mutipartFormData 时覆盖了以前的图像数据值。但是通过将[ ] 方括号附加到参数名称的末尾,它可以在数组中加载数据。而已。您可以在邮递员应用程序中看到相同的内容来上传图像数组。谢谢。如果没问题,请点赞。
  • 你能告诉我上面代码中的 withName: "(imageParamName)[]" 是什么吗??
  • withName 是接受媒体数据键名的参数,因为它是在 'imageParamName' 变量中发送的值,使用方括号 '[ ]' 是为了标识他们这个参数包含数组值。
  • 好的..我们需要在使用它之前声明 imageParamName,因为它会给我这个名称的错误吗?
【解决方案2】:

这个对我有帮助:

private func urlRequestWithComponentsForUploadMultipleImages(urlString:String, parameters:Dictionary<String, String>, imagesData:[Data], imageName: String) -> (URLRequestConvertible , Data) {

    // create url request to send
    var mutableURLRequest = URLRequest(url: NSURL(string: urlString)! as URL)

    mutableURLRequest.httpMethod = Alamofire.HTTPMethod.post.rawValue
    let boundaryConstant = "myRandomBoundary12345";
    let contentType = "multipart/form-data;boundary="+boundaryConstant
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")


    // create upload data to send
    var uploadData = Data()
    // add image
    for data in imagesData {
        uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(Date().timeIntervalSince1970).jpeg\"\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append("Content-Type: image/jpeg\r\n\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append(data)
    }
    // add parameters
    for (key, value) in parameters {
        uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
        uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!)
    }
    uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!)
    print("upload",parameters)
    return (mutableURLRequest , uploadData)
}

【讨论】:

    【解决方案3】:

    这是我的解决方案,它可以 100% 工作,没有错误..

            Alamofire.upload(multipartFormData: { (multipartFormData : MultipartFormData) in
    
                let count = imageToUpload.count
    
                for i in 0..<count{
                    multipartFormData.append(imageToUpload[i], withName: "morephoto[\(i)]", fileName: "photo\(i).jpeg" , mimeType: "image/jpeg")
    
                }
                for (key, value) in parameterrs {
    
                        multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
                }
                print(multipartFormData)
            }, to: url!) { (result) in
    
                    switch result {
                    case .success(let upload, _ , _):
    
                        upload.uploadProgress(closure: { (progress) in
    
                            print("uploding: \(progress.fractionCompleted)")
                        })
    
                        upload.responseJSON { response in
    
                        print(response.result.value!)
                        let resp = response.result.value! as! NSDictionary
                        if resp["status"] as! String == "success"{
                            print(response.result.value!)
                            let alert = UIAlertController(title: "Alert", message: "Image Upload Successful", preferredStyle: UIAlertControllerStyle.alert)
                            alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.default, handler: nil))
                            self.present(alert, animated: true, completion: nil)
    
    
                        }
                        else{
    
                        }
    
    
                    }
    
                case .failure(let encodingError):
                    print("failed")
                    print(encodingError)
    
                }
            }
    

    这里的imagetoupload数组是我之前制作的图像数据数组。

    【讨论】:

      【解决方案4】:

      看起来这个问题已经在 SO 上得到了回答,可能在多个地方。这是我找到的一个链接:

      How to upload multiple images in multipart using Alamofire?

      为方便起见,我将粘贴他们的解决方案,但他们说它适用于 Swift 3.x:

      //MARK: - upload multiple photos
      
      func uploadImagesAndData(params:[String : AnyObject]?,image1: UIImage,image2: UIImage,image3: UIImage,image4: UIImage,headers : [String : String]?, completionHandler:@escaping CompletionHandler) -> Void {
      
          let imageData1 = UIImageJPEGRepresentation(image1, 0.5)!
          let imageData2 = UIImageJPEGRepresentation(image2, 0.5)!
      
          let imageData3 = UIImageJPEGRepresentation(image3, 0.5)!
      
          let imageData4 = UIImageJPEGRepresentation(image4, 0.5)!
      
      
          Alamofire.upload(multipartFormData: { multipartFormData in
      
                  for (key, value) in params! {
                      if let data = value.data(using: String.Encoding.utf8.rawValue) {
                          multipartFormData.append(data, withName: key)
                      }
                  }
      
                  multipartFormData.append(imageData1, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                  multipartFormData.append(imageData2, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                  multipartFormData.append(imageData3, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                  multipartFormData.append(imageData4, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
      
          },
              to: K_BASEURL + K_API_LOGINDATA, encodingCompletion: { encodingResult in
                  switch encodingResult {
                  case .success(let upload, _, _):
                      upload
                          .validate()
                          .responseJSON { response in
                              switch response.result {
                              case .success(let value):
                                  print("responseObject: \(value)")
                              case .failure(let responseError):
                                  print("responseError: \(responseError)")
                              }
                      }
                  case .failure(let encodingError):
                      print("encodingError: \(encodingError)")
                  }
          })
      

      该解决方案似乎基于 Alamofire 文档中详述的推荐方法:https://github.com/Alamofire/Alamofire#uploading-multipartformdata

      Alamofire.upload(
      multipartFormData: { multipartFormData in
          multipartFormData.append(unicornImageURL, withName: "unicorn")
          multipartFormData.append(rainbowImageURL, withName: "rainbow")
      },
      to: "https://httpbin.org/post",
      encodingCompletion: { encodingResult in
          switch encodingResult {
          case .success(let upload, _, _):
              upload.responseJSON { response in
                  debugPrint(response)
              }
          case .failure(let encodingError):
              print(encodingError)
          }
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-21
        • 2019-11-24
        • 2018-05-31
        • 2017-09-09
        • 2017-03-08
        • 1970-01-01
        • 2015-07-11
        相关资源
        最近更新 更多