2015-12-02 34 views
4

我设法与上传多形式的数据Alamofire上传文件:Alamofire - 如何与多上传进度和完成关闭

Alamofire.upload(.POST, "api.myservice.com", headers: myheaders, multipartFormData: { (multipartFormData:MultipartFormData) -> Void in 

    multipartFormData.appendBodyPart(data: json, name: "metadata", mimeType: "application/json") 
    multipartFormData.appendBodyPart(data: self.data, name: "document", fileName: "photo.png", mimeType: "image/png") 

}, encodingMemoryThreshold: 10 * 1024 * 1024) { (result:Manager.MultipartFormDataEncodingResult) -> Void in 
} 

,但我看不到的方式来跟踪上传进度,并有上载完成(或失败)后调用完成块。 Alamofire有没有办法做到这一点?

注:我知道上传的进度是可能的,但我正在研究多部分形式的数据。

回答

14

这里是一个办法有完成,失败和进度关闭(感谢我的同事对我点的解决方案):

Alamofire.upload(.POST, absPath(), headers: headers(), multipartFormData: { (multipartFormData:MultipartFormData) -> Void in 

    multipartFormData.appendBodyPart(data: json, name: "metadata", mimeType: "application/json") 
    multipartFormData.appendBodyPart(data: self.data, name: "document", fileName: "photo.png", mimeType: "image/png") 

    }, encodingMemoryThreshold: 10 * 1024 * 1024, encodingCompletion: { (encodingResult) -> Void in 
     switch encodingResult { 
     case .Success(let upload, _, _): 
      upload.responseJSON { response in 
       // success block 
     } 
      upload.progress { _, totalBytesRead, totalBytesExpectedToRead in 
       let progress = Float(totalBytesRead)/Float(totalBytesExpectedToRead) 
       // progress block 
      } 
     case .Failure(_): 
      // failure block 
     } 
}) 
4

接受的答案是伟大的。这一个也包括参数:

let image = UIImage(named: "big.jpg")! 
let imageData = UIImageJPEGRepresentation(image, 1) 

let coupon = textBox?.text ?? "NO coupon" 
let uploadUrl = "http://example.com/upload.php" 
// define parameters 
let parameters : [String: String] = ["one":"some param", "two":"some other param"] 

Alamofire.upload(.POST, uploadUrl, headers: nil, 
    multipartFormData: { multipartFormData in 
     multipartFormData.appendBodyPart(data: imageData!, name: "cannotBeBlank", fileName: "image.zip", mimeType: "image/png") 

     // import parameters 
     for (key, value) in parameters { 
      multipartFormData.appendBodyPart(data: value.data!, name: key) 
     } 
    }, encodingCompletion: { encodingResult in 
     switch encodingResult { 
      case .Success(let upload, _, _): 
       upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in 
        print("1) \(bytesWritten) 2) \(totalBytesWritten) 3) \(totalBytesExpectedToWrite)") 

        // This closure is NOT called on the main queue for performance 
        // reasons. To update your ui, dispatch to the main queue. 
        dispatch_async(dispatch_get_main_queue()) { 
         print("Total bytes written on main queue: \(totalBytesWritten)") 
        } 
       } 


       upload.responseData(self.handleResponse) 
      case .Failure: 
       self.handleError() 
     } 
}) 
+1

这适用于我。谢谢! –

+0

很高兴听到它。希望它在Swift 3中不会打破太多! –