[英]How to know the progress of upload in swift multipart request
I am using NSMutableURLRequest
for multipart request in Swift iOS. 我在Swift iOS中使用
NSMutableURLRequest
进行多部分请求。 How I can get the progress of the uploaded data on the server? 如何获取服务器上已上传数据的进度?
Currently I am using the following code: 目前,我正在使用以下代码:
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()
I had this same problem. 我有同样的问题。 I'm using AFNetworking.
我正在使用AFNetworking。 Instead of using
dataTaskWithRequest
I found that I needed to use uploadTaskWithStreamedRequest
with a callback for my method, progressCallback
. 我发现没有使用
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()
}
I use Alamofire (Swift 2.3) to send multipart with progress. 我使用Alamofire(Swift 2.3)随进度发送多部分。 Here is code:
这是代码:
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
}
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.