2011-10-24 28 views
3

是否可以使用NSURLConnection/NSURLRequest組合向具有Content-Range標頭的服務器發送PUT請求?我的意思是我想恢復上傳到服務器,該服務器可以接受請求中的字節範圍以恢復上傳。Cocoa HTTP PUT with content-range

我看到你可以設置一個NSInputStream作爲請求體,所以我想我可以繼承它並覆蓋open/seek函數並設置請求標題,但它似乎調用未公開的選擇器並中斷實現。

我確定我可以用CFNetwork做到這一點,但它似乎必須有一種方法來處理更高級別的API。

任何想法從哪裏開始?

編輯:

要回答我的問題,這確實是可能的閱讀博客[http://bjhomer.blogspot.com/2011/04/subclassing-nsinputstream.html]裏面詳細介紹了無證回調後涉及到CFStream。一旦這些都實現我可以調用open回調下面來跳到:

CFReadStreamSetProperty((CFReadStreamRef)parentStream, kCFStreamPropertyFileCurrentOffset, (CFNumberRef)[NSNumber numberWithUnsignedLongLong:streamOffset]); 

感謝, Ĵ

+0

注意:不需要下拉到CF級別:' - [NSStream setPorperty:forKey:]'可以讓你做到這一點!這裏使用的關鍵是'NSStreamFileCurrentOffsetKey',它自10.3開始在OS X中,自2.0開始在iOS上。 (請參閱[「常量」](http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSStream_Class/Reference/Reference.html#//apple_ref/doc/uid/20001981 -SW24)部分在'NSStream'文件) – danyowdee

+0

完美,這正是我需要的!如果你添加這個作爲答案,我會接受它。謝謝 – JWood

+0

完成。看到下面,並享受... – danyowdee

回答

1

就像我貼在我的評論,你可以方便你想要的東西沒有下降到下來的CoreFoundation級別:

由於NSInputStream繼承NSStream,可以如下準備流:

NSNumber *streamOffset = [NSNumber numberWithUnsignedInteger:lastOffset]; 

[inputStream setProperty:streamOffset forKey: NSStreamFileCurrentOffsetKey]; 

(假設lastOffset是你的最後一個文件的NSUInteger表示以字節爲單位inputStream偏移要設置爲流請求的HTTPBodyStream。)

5

我認爲,服務器需要支持把方法與範圍結合,但是這將是路高層次的Objective-C API做

 NSURL *URL = [NSURL URLWithString:strURL]; 
     NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:URL]; 
     NSString *range = [NSString stringWithFormat:@"bytes=%lld-%lld",bytesUploaded,uploadSize]; 
     [urlRequest addValue:range forHTTPHeaderField:@"Range"]; 
     [urlRequest setHTTPMethod:@"PUT"]; 
     self.connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self]; 

乾杯

+0

謝謝,以上從根本上是正確的,但問題是與輸入流。該文檔說:「流的全部內容將作爲主體發送,就像在HTTP POST請求中一樣,inputStream應該是未開啓的,接收者將接管流的委託。」這是不可取的,我需要流來尋找正確的偏移量並從那裏發送。 – JWood

2

首先,如果你想要做HT花式工作TP,我通常建議ASIHTTPRequest。它是可靠的,可以簡化許多更復雜的HTTP問題。設置一個簡單的頭文件並不是真的需要,但是如果你開始構建更復雜的東西,那麼很快就會轉向ASI而不是以後。

隨着NSMutableURLRequest,你可以使用addValue:forHTTPHeaderField:設置任何你想要的標題。你可以用它來設置你的Content-Range

+2

我已經在使用ASIHTTPRequest,因爲它不再被支持或開發,所以我不再使用它。儘管如此,它也遇到了同樣的問題,即設置標頭很好,但是整個流發送的請求體不正確。我需要以某種方式尋找到正確的字節偏移量的流,只發送剩餘的字節。 – JWood