所以我有一些代码,我一直用来在我的应用程序中上传文件,按照以下方式:
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 =
行来执行此类任务吗?
答案 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()
来管理磁盘上文件的分块。