【问题标题】:how to upload image (Multipart) using Alamofire 5.0.0-beta.3 (Swift 5)如何使用 Alamofire 5.0.0-beta.3 (Swift 5) 上传图片(多部分)
【发布时间】:2019-09-01 17:16:46
【问题描述】:

我正在使用多部分上传图片。此代码在 swift 4Alamofire 4 中运行良好。请为此提供任何解决方案。

public class func callsendImageAPI(param:[String: Any],arrImage:[UIImage],imageKey:String,URlName:String,controller:UIViewController, withblock:@escaping (_ response: AnyObject?)->Void){

    Alamofire.upload(multipartFormData:{ MultipartFormData in

        for (key, value) in param {
            MultipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
        }

        for img in arrImage {

            guard let imgData = img.jpegData(compressionQuality: 1) else { return }
            MultipartFormData.append(imgData, withName: imageKey, fileName: FuncationManager.getCurrentTimeStamp() + ".jpeg", mimeType: "image/jpeg")
        }

    },usingThreshold:UInt64.init(),
      to: "URL",
        method:.post,
        headers:["Content-type": "multipart/form-data",
                 "Content-Disposition" : "form-data"],
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, , ):

                upload.uploadProgress(closure: { (Progress) in
                    print("Upload Progress: \(Progress.fractionCompleted)")
                })

                upload.responseJSON { response in
                    switch(response.result) {
                    case .success(_):
                        let dic = response.result.value as! NSDictionary
                        if (dic.object(forKey:  "status")! as! Int == 1){
                            withblock(dic.object(forKey: "data") as AnyObject)
                        }else if (dic.object(forKey: Message.Status)! as! Int == 2){
                            print("error message")

                        }else{
                            print("error message")
                        }
                    case .failure(_):
                        print("error message")
                    }
                }

            case .failure(let encodingError):
                print("error message")
            }
    })}

提前致谢。

【问题讨论】:

    标签: ios alamofire swift5


    【解决方案1】:

    Almofire 5.0 和 Swift 5.0

        //Set Your URL
        let api_url = "YOUR URL"
        guard let url = URL(string: api_url) else {
            return
        }
    
        var urlRequest = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0 * 1000)
        urlRequest.httpMethod = "POST"
        urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
    
        //Set Your Parameter
        let parameterDict = NSMutableDictionary()
        parameterDict.setValue(self.name, forKey: "name")
    
        //Set Image Data
        let imgData = self.img_photo.image!.jpegData(compressionQuality: 0.5)!
    
       // Now Execute 
        AF.upload(multipartFormData: { multiPart in
            for (key, value) in parameterDict {
                if let temp = value as? String {
                    multiPart.append(temp.data(using: .utf8)!, withName: key as! String)
                }
                if let temp = value as? Int {
                    multiPart.append("\(temp)".data(using: .utf8)!, withName: key as! String)
                }
                if let temp = value as? NSArray {
                    temp.forEach({ element in
                        let keyObj = key as! String + "[]"
                        if let string = element as? String {
                            multiPart.append(string.data(using: .utf8)!, withName: keyObj)
                        } else
                            if let num = element as? Int {
                                let value = "\(num)"
                                multiPart.append(value.data(using: .utf8)!, withName: keyObj)
                        }
                    })
                }
            }
            multiPart.append(imgData, withName: "file", fileName: "file.png", mimeType: "image/png")
        }, with: urlRequest)
            .uploadProgress(queue: .main, closure: { progress in
                //Current upload progress of file
                print("Upload Progress: \(progress.fractionCompleted)")
            })
            .responseJSON(completionHandler: { data in
    
                       switch data.result {
    
                       case .success(_):
                        do {
                        
                        let dictionary = try JSONSerialization.jsonObject(with: data.data!, options: .fragmentsAllowed) as! NSDictionary
                          
                            print("Success!")
                            print(dictionary)
                       }
                       catch {
                          // catch error.
                        print("catch error")
    
                              }
                        break
                            
                       case .failure(_):
                        print("failure")
    
                        break
                        
                    }
    
    
            })
    

    很高兴为您提供帮助:)

    它适合我

    【讨论】:

      【解决方案2】:

      请参考下面的代码。

      public class func callsendImageAPI(param:[String: Any],arrImage:[UIImage],imageKey:String,URlName:String,controller:UIViewController, withblock:@escaping (_ response: AnyObject?)->Void){
      
          let headers: HTTPHeaders
          headers = ["Content-type": "multipart/form-data",
                     "Content-Disposition" : "form-data"]
          
          AF.upload(multipartFormData: { (multipartFormData) in
              
              for (key, value) in param {
                  multipartFormData.append((value as! String).data(using: String.Encoding.utf8)!, withName: key)
              }
              
              for img in arrImage {
                  guard let imgData = img.jpegData(compressionQuality: 1) else { return }
                  multipartFormData.append(imgData, withName: imageKey, fileName: FuncationManager.getCurrentTimeStamp() + ".jpeg", mimeType: "image/jpeg")
              }
              
              
          },usingThreshold: UInt64.init(),
            to: URL.init(string: URlName)!,
            method: .post,
            headers: headers).response{ response in
              
              if((response.error != nil)){
                  do{
                      if let jsonData = response.data{
                          let parsedData = try JSONSerialization.jsonObject(with: jsonData) as! Dictionary<String, AnyObject>
                          print(parsedData)
                          
                          let status = parsedData[Message.Status] as? NSInteger ?? 0
                          
                          if (status == 1){
                              if let jsonArray = parsedData["data"] as? [[String: Any]] {
                                  withblock(jsonArray as AnyObject)
                              }
                              
                          }else if (status == 2){
                              print("error message")
                          }else{
                              print("error message")
                          }
                      }
                  }catch{
                      print("error message")
                  }
              }else{
                   print(response.error!.localizedDescription)
              }
          }
      }
      

      很高兴为您提供帮助:)

      【讨论】:

      • 您好,如何获取上传进度?
      • 我花了更多的时间来找到为什么我无法得到响应,即使错误也为零,终于我找到了。在这里,需要更改为“if((response.error == nil))”而不是“if((response.error != nil))”,但是您节省了我的时间谢谢@dixit
      猜你喜欢
      • 2019-08-12
      • 2017-03-13
      • 1970-01-01
      • 2017-03-08
      • 2017-06-10
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多