Ios 如何在没有多部分的情况下获得文件上载的进度?
在URLSession的帮助下,我正在用swift上传文件。但问题是我并没有得到上传的进展。我没有使用任何多部分请求。我只是在请求正文中发送视频数据Ios 如何在没有多部分的情况下获得文件上载的进度?,ios,swift,nsurlsession,Ios,Swift,Nsurlsession,在URLSession的帮助下,我正在用swift上传文件。但问题是我并没有得到上传的进展。我没有使用任何多部分请求。我只是在请求正文中发送视频数据 let urlStr = UserDefaults.standard.value(forKey: "Resumable") as? String ?? "" let url = URL(string: urlStr) do{ var request = try URLRequest(url: url!, method: .put)
let urlStr = UserDefaults.standard.value(forKey: "Resumable") as? String ?? ""
let url = URL(string: urlStr)
do{
var request = try URLRequest(url: url!, method: .put)
// request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
// request.setValue("300000", forHTTPHeaderField: "X-Upload-Content-Length")
request.setValue("video/*", forHTTPHeaderField: "Content-Type")
request.setValue("278", forHTTPHeaderField: "Content-Length")
request.timeoutInterval = 60.0
let path = Bundle.main.path(forResource: "video", ofType: "mov")
let videodata: NSData = NSData.dataWithContentsOfMappedFile(path!)! as! NSData
request.httpBody = videodata as Data
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
if let httpResponse = response as? HTTPURLResponse {
print(httpResponse.allHeaderFields)
if httpResponse.statusCode != 200 {
return
}else{
if let url = httpResponse.allHeaderFields["Location"] as? String{
}
}
}
})
task.resume()
}catch{
}
请告诉我如何获取上载的字节数的进度?您需要实现
urlSession(\uuU2:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)
委托方法。为此,您需要创建自己的会话并设置其委托
您还应该使用上载任务。这样可以避免将文件加载到内存中
以下是do
块中更新的代码:
var request = try URLRequest(url: url!)
// request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
// request.setValue("300000", forHTTPHeaderField: "X-Upload-Content-Length")
request.setValue("video/*", forHTTPHeaderField: "Content-Type")
request.setValue("278", forHTTPHeaderField: "Content-Length")
request.timeoutInterval = 60.0
let videoURL = Bundle.main.url(forResource: "video", withExtension: "mov")!
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
let task = session.uploadTask(with: request, fromFile: videoURL) { (data, response, error) in
if let httpResponse = response as? HTTPURLResponse {
print(httpResponse.allHeaderFields)
if httpResponse.statusCode != 200 {
return
}else{
if let url = httpResponse.allHeaderFields["Location"] as? String{
}
}
}
}
task.resume()
然后添加:
func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
// update progress as needed
}
见: