2016-11-22 39 views
0

所以我有一些代碼,我一直在使用在我的應用程序上傳文件,沿此線:上傳通過URLSession大文件

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

你試過'uploadTask(with:fromFile:)'?從文件中流式傳輸可能足夠聰明,而不是將所有內容加載到「數據」中。或者可以使用'uploadTask(withStreamedRequest :)'。 – rmaddy

+0

我猜這不適用於我,因爲我需要用其他一些HTTP垃圾來裝飾每個塊,所以我的服務器知道發生了什麼。然而,不管它在封面下用來做什麼都可能是我需要的。 –

回答

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

我也呼籲_inputStream?.close()對管理的分塊我班DEINIT磁盤上的文件。