ios - 如何在没有多部分的情况下获取文件上传进度?

标签 ios swift nsurlsession

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

请告诉我如何获得上传了多少字节的进度?

最佳答案

您需要实现 urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) 委托(delegate)方法。为此,您需要创建自己的 session 并设置其委托(delegate)。

您还应该使用上传任务。这避免了将文件加载到内存中的需要。

这是 do block 中的更新代码:

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
}

关于ios - 如何在没有多部分的情况下获取文件上传进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50332397/

相关文章:

ios - Swift UIImage 转换为 PDF

ios - 无法点击嵌入在 UIPageViewController (ScrollStyle) 中的 UITableView - didSelectRowAtIndexPath 未触发

ios - 当应用程序处于后台或被杀死时如何定期获取新位置

ios - Swift - 单击按钮更改 UIPageViewController View

ios - 当你点击一个单元格时,placeholderImage 被传输,当我返回后,向上并点击照片正在更改的同一个单元格

ios - 带有 NSURLSession 的 Swift 中的 HTTP 请求

ios - 在 UIView/UIWindow 上应用过滤器以修改底层 View 渲染

ios - 从其他目标访问方法到 Today Extension?

javascript - OSX 上的 Swift : WebView stringByEvaluatingJavaScriptFromString doesn't work

ios - NSURLSession:后台崩溃,因为没有调用上传委托(delegate)