如何使用 Alamofire 5.0.0-beta.3 (Swift 5) 上传图片(多部分)

Posted

技术标签:

【中文标题】如何使用 Alamofire 5.0.0-beta.3 (Swift 5) 上传图片(多部分)【英文标题】:how to upload image (Multipart) using 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")
            
    )

提前致谢。

【问题讨论】:

【参考方案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

以上是关于如何使用 Alamofire 5.0.0-beta.3 (Swift 5) 上传图片(多部分)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 alamofire 中使用自定义动词?

CocoaPods 找不到 pod “5.0.0-beta.1” 的兼容版本

缺少可观察的方法 RxJS 5.0.0-beta.0

Rails 5.0.0.beta1 - 从未过滤的请求参数生成 URL 是不安全的

Zabbix upgrade 5.0.0beta1

Zabbix 5.0.0beta1版本初体验