2011-06-12 55 views
2

我試圖通過HTTP請求從Web服務器上下載文件[> 40MB]。爲此,我使用了Apple提供的SimpleURLConnection示例。在這個示例中,他們只下載圖像文件,所以我修改了代碼以下載pdf文件並將其存儲在應用程序的文檔目錄中。這可以很好地下載小文件,但如果我嘗試下載大文件[> 40Mb],它只會下載6.4MB的數據。請大家幫我解決這個問題,如何在iOS下載大文件?

謝謝

FYI:

代碼寫入文件與下載的數據

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data 
    // A delegate method called by the NSURLConnection as data arrives. We just 
    // write the data to the file. 
{ 
    #pragma unused(theConnection) 
    NSInteger  dataLength; 
    const uint8_t * dataBytes; 
    NSInteger  bytesWritten; 
    NSInteger  bytesWrittenSoFar; 

    assert(theConnection == self.connection); 

    dataLength = [data length]; 
    dataBytes = [data bytes]; 

    bytesWrittenSoFar = 0; 
    do { 
     bytesWritten = [self.fileStream write:&dataBytes[bytesWrittenSoFar] maxLength:dataLength - bytesWrittenSoFar]; 
     assert(bytesWritten != 0); 
     if (bytesWritten == -1) { 
      [self _stopReceiveWithStatus:@"File write error"]; 
      break; 
     } else { 
      bytesWrittenSoFar += bytesWritten; 
     } 
    } while (bytesWrittenSoFar != dataLength); 
} 
+0

你有沒有調試信息?哦,'assert(theConnection == self.connection)'是如此可怕,以至於如果你使用多個連接,這段代碼註定會崩潰。使用'if(theConnection!= self.connection){return;而不是。 – 2011-06-12 14:59:14

回答

7

不要重新發明輪子! ASIHTTP涵蓋了,see there。有一個特定的選項可以直接下載到文件。

+0

+1和我會第二個 – Robin 2011-06-12 15:02:30

+1

在Stackoverflow上,約20個新手問題中的1個的答案是「使用ASIHttpRequest」...! – Fattie 2011-06-12 20:04:42

+0

但它只是它的方式 - 它是所有這些下載問題的最簡單的解決方案:) – LordT 2011-06-13 13:35:49

2

截止到2011年9月,ASIHTTP已不再活躍。我發現RestKit在許多情況下是一個很好的選擇,但它缺少很多ASI功能,如下載暫停和恢復。

+0

此主題的任何更新。我試圖找到一種方法來下載具有簡歷功能的大文件...(不使用ASI).. – fvisticot 2012-08-24 21:33:00

+0

您可以試試[ANDownload](https://github.com/unixpickle/ANDownload)。 – ashack 2012-08-30 15:02:47

+1

AFNetworking看起來像這些天去的方式。 http://afnetworking.com – 2013-01-26 00:06:13