Как получить прогресс загрузки файла без multipart? - PullRequest
0 голосов
/ 14 мая 2018

Я загружаю файл в swift с помощью URLSession. Но проблема в том, что я не получаю прогресс для загрузки. Я не использую многочастный запрос. Я просто отправляю данные видео в теле запроса.

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{
}

Скажите, пожалуйста, как я могу узнать, сколько байтов было загружено?

1 Ответ

0 голосов
/ 14 мая 2018

Вам необходимо реализовать метод делегата urlSession(_: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
}
...