【发布时间】:2018-10-20 23:45:14
【问题描述】:
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 282
--3d6b6a416f9b5
Content-Type: video/mp4
Content-Range: bytes 0-50/1270
DATA............
--3d6b6a416f9b5
Content-Type: video/mp4
Content-Range: bytes 100-150/1270
eta http-equiv="Content-type" content="text/html; c
--3d6b6a416f9b5--
这是我从 Mozilla 得到的示例响应。我正在使用 swift 并使用 URLSession 创建多部分范围请求。我得到一个响应,我用 ascii 编码转换为[UInt8] 和String 我可以获得边界字符串。但是我想知道如何才能可靠地提取每个范围请求中的内容,而不管内容类型和内容范围如何。我意识到我可以获得 --3d6b6a416f9b5 .... --3d6b6a416f9b5 块,但如何准确删除内容标题。
let ranges : [(Int, Int)] = [...]
var range_request = "bytes="
for r in ranges {
range_request += "\(r.0)-\(r.1), "
}
range_request = String(range_request.dropLast(2))
var streamRequest = URLRequest(url: streamURL)
streamRequest.setValue(range_request, forHTTPHeaderField: "Range")
let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 1
let session = URLSession(configuration: sessionConfig)
let task = session.downloadTask(with: streamRequest) { (tempLocalURL, response, url_error) in
if url_error != nil {
//handle error
} else {
do {
//assume successful 206 response for now...
let httpResponse = response as! HTTPURLResponse
let data = try Data(contentsOf: tempLocalURL!)
let boundaryPhrase = (httpResponse.allHeaderFields["Content-Type"]! as! String).replacingOccurrences(of: "multipart/byteranges; boundary=", with: "")
let totalData = [UInt8](data)
let stringTotalData = (String(data: data, encoding: .ascii)!
} catch {
//handle error
}
}
}
task.resume()
【问题讨论】:
标签: swift http range nsurlsession