通过URLSession上传大文件

时间:2016-11-22 00:00:50

标签: ios swift swift3 nsurlsession

所以我有一些代码,我一直用来在我的应用程序中上传文件,按照以下方式:

var mutableURLRequest = URLRequest(url: url)
var uploadData = try! Data(contentsOf: dataUrl)
session.uploadTask(with: mutableURLRequest, from: uploadData).resume()

还有一点比这更多,但那些是相关的部分。但是我注意到一些大型视频文件Data(contentsOf: dataUrl)失败,因为文件很大,无法加载到内存中。我想对其进行重组,以便我能够逐个流式传输到服务器,而无需将整个文件加载到内存中。

我已经从我的服务器中找到了这个,我唯一没想到的是如何从URL中的数据中获取chunkSize块,而不将其放入数据对象中。我基本上想要这个结构:

let chunkSize = 1024 * 1024
let offset = 0
let chunk = //get data from dataUrl of size chunkSize offset by offset

//Upload each chunk and increment offset

NSInputStream似乎很有希望能够做到这一点,但我无法找出最小设置,以便以这种方式从磁盘上的文件中提取字节。我可以使用上面的代码填写let chunk =行来执行此类任务吗?

1 个答案:

答案 0 :(得分:0)

我有一个可行的解决方案,可能需要一些调整,但似乎适用于我尝试过的大文件:

public func getNextChunk() -> Data?{
    if _inputStream == nil {
        _inputStream = InputStream(url: _url)
        _inputStream?.open()
    }
    var buffer = [UInt8](repeating: 0, count: CHUNK_SIZE)
    var len = _inputStream?.read(&buffer, maxLength: CHUNK_SIZE)
    if len == 0 {
        return nil
    }
    return Data(buffer)
}

我也在我的类的deinit上调用_inputStream?.close()来管理磁盘上文件的分块。