【问题标题】:How to know the progress of upload in swift multipart request如何知道快速多部分请求中的上传进度
【发布时间】:2015-12-20 11:43:36
【问题描述】:

我在 Swift iOS 中使用 NSMutableURLRequest 进行多部分请求。如何获取服务器上传数据的进度?

目前我正在使用以下代码:

let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
var request = NSMutableURLRequest(URL: url, cachePolicy: cachePolicy, timeoutInterval: 30000)
request.HTTPMethod = "POST"
request.setValue(NSUserDefaults.standardUserDefaults().objectForKey("access-token") as? String, forHTTPHeaderField: "Authorization")
// set Content-Type in HTTP header
let boundary = generateBoundaryString()

var body = NSMutableData.alloc()

request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.HTTPBody = createBodyWithParameters(parameters, filePathKey: filePathKey, data: data, boundary: boundary, fileName:filename, jsonData: jsonData)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
    data, response, error in

    if error != nil {
        println("error=\(error)")
        failed(errorCode: error.code)
        return
    }else{
        var error: NSError?
        var json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error)
        let parsedJson = JSON(json!)
        completion(parsedJSON: parsedJson)
    }
}

task.resume()

【问题讨论】:

    标签: ios swift file-upload upload multipartform-data


    【解决方案1】:

    我遇到了同样的问题。我正在使用 AFNetworking。而不是使用dataTaskWithRequest,我发现我需要使用uploadTaskWithStreamedRequest 和我的方法的回调progressCallback

    if request != nil
        {
    
            let manager = AFURLSessionManager.init(sessionConfiguration: NSURLSessionConfiguration.defaultSessionConfiguration())
    
            let uploadTask = manager.uploadTaskWithStreamedRequest(request,
                progress:
                { (uploadProgress) -> Void in
                    dispatch_async(dispatch_get_main_queue())
                    {
                        progressCallback(progress: Float(uploadProgress.fractionCompleted))
                    }
                },
                completionHandler:
                { (data, response, error) -> Void in
                    if error != nil
                    {
                        DDLogSwift.error("There was an error uploading. Error: \(error)")
                    }
                    else
                    {
                        DDLogSwift.debug("Response: \(data)")
                    }
                })
            uploadTask.resume()
        }
    

    【讨论】:

      【解决方案2】:

      我使用 Alamofire (Swift 2.3) 发送带有进度的多部分。这是代码:

      func upload(URLRequest: Router, onProgress: (progress: Float?) -> Void, completion: (json: AnyObject?, error: Error?) -> Void) {
          let headers:[String: String] = [:]
      
          let router = URLRequest.URLRequest
          let tuple = URLRequest.parameters
          let parameters = tuple.0!
          let imagesData = tuple.1
          let url = router.URLString
      
          self.manager!.upload(
              .POST,
              url,
              headers: headers,
              multipartFormData: { (multipartFormData: MultipartFormData) -> Void in
                  for value in imagesData {
                      var mimeType = "video/jpg"
                      var bodyName = "images"
                      let filename = value.uniqueName
                      if value.mediaType == ReporterMediaType.image {
                          mimeType = "image/jpg"
                          bodyName = "images"
                      } else if value.mediaType == ReporterMediaType.video {
                          mimeType = "video/quicktime"
                          bodyName = "video"
                      } else if value.mediaType == ReporterMediaType.videoFrame {
                          mimeType = "image/jpg"
                          bodyName = "videoFrame"
                      }
                      multipartFormData.appendBodyPart(
                          data: value.data,
                          name: bodyName,
                          fileName: filename,
                          mimeType: mimeType)
                  }
                  for (key, value) in parameters {
                      multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
                  }
              },
              encodingCompletion: { (encodingResult) -> Void in
                  switch encodingResult {
                  case .Success(let upload, _, _):
                      upload.responseJSON { response in
                          if response.result.isSuccess || response.response?.statusCode == 200 {
                              completion(json: upload, error: nil)
                          } else {
                              dispatch_async(dispatch_get_main_queue()) {
                                  completion(json: nil, error: response.result.error)
                              }
                          }
                      }
                      upload.progress { _, totalBytesRead, totalBytesExpectedToRead in
                          let progress = Float(totalBytesRead)/Float(totalBytesExpectedToRead)
                          onProgress(progress: progress)
                      }
                  case .Failure:
                      UIApplication.sharedApplication().networkActivityIndicatorVisible = false
                      break
                  }
          })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 2012-08-19
        • 2017-02-16
        • 1970-01-01
        相关资源
        最近更新 更多