2011-10-24 9 views
3

NSURLConnection/NSURLRequestの組み合わせを使用してContent-Rangeヘッダーを持つサーバーにPUT要求を送信できますか?これで、アップロードを再開するリクエストでバイト範囲を受け入れることができるサーバーへのアップロードを再開したいということです。Cocoa HTTP PUT with content-range

NSInputStreamをリクエスト本体として設定できるので、サブクラス化してオープン/シーク関数をオーバーライドしてリクエストヘッダーを設定できるとわかりましたが、ドキュメント化されていないセレクタを呼び出して実装を破るようです。

私はCFNetworkでこれを行うことができると確信していますが、より高いレベルのAPIでそれを行う方法が必要であるように思えます。

どこから始めたらよいですか?

EDIT:

自分の質問に答えるために、これは実際に可能である文書化されていないコールバックの詳細をブログ[http://bjhomer.blogspot.com/2011/04/subclassing-nsinputstream.html]を読んだ後にCFStreamに関連しています。それらが実装されていたら、私は先にスキップするopenコールバックに次のように呼び出すことができます。

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

おかげで、 J

+0

注:CFレベルに落とす必要はありません。 ' - [NSStream setPorperty:forKey:]'では、これをうまくやり遂げることができます!使用する鍵は、NSStreamFileCurrentOffsetKeyです。これは、OS X 10.3以降、iOS OS 2.0以降です。 (「定数」を参照してください(http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSStream_Class/Reference/Reference.html#//apple_ref/doc/uid/20001981)。 -SW24)のセクションを参照してください。 – danyowdee

+0

パーフェクト、それはまさに私が必要なものです!これを回答として追加すると、私はそれを受け入れます。ありがとう – JWood

+0

が完了しました。下を参照してください... – danyowdee

答えて

1

、あなたがCoreFoundationのレベルまで落とさずに欲しいものを容易にすることができる:

NSInputStreamとして継承NSStream、次のようにストリームを製造することが可能である:

NSNumber *streamOffset = [NSNumber numberWithUnsignedInteger:lastOffset]; 

[inputStream setProperty:streamOffset forKey: NSStreamFileCurrentOffsetKey]; 

lastOffsetは最後のファイルオフセットをバイト単位で表したNSUIntegerとし、inputStreamは要求のHTTPBodyStreamとして設定するストリームです)

5

私は、サーバーがサポートする必要があると思いますが、この方法は、範囲と結合置くが、これが邪魔になりますあなたはHTと空想の仕事をしたい場合は、

+0

ありがとう、上記の根本的に正しいですが、問題は入力ストリームです。ドキュメンテーションによれば、「HTTP POSTリクエストのように、ストリームの内容全体が本文として送信されます。入力ストリームは開かれていて、受信者はストリームのデリゲートとして引き継がれます。それは望ましくない、私は正しいオフセットを求めてストリームをそこから送信する必要があります。 – JWood

2

まず

 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]; 

乾杯ハイレベルのObjective-C APIでそれを行うにはTP、私は通常ASIHTTPRequestをお勧めします。これは、複雑なHTTP問題を単純化する堅実なものです。シンプルなヘッダーを設定するのには本当に必要なわけではありませんが、もっと複雑なものを作成する場合は、後でなく早くASIに移行するのが良いでしょう。

NSMutableURLRequestでは、addValue:forHTTPHeaderField:を使用して任意のヘッダーを設定できます。これを使用してContent-Rangeを設定することができます。私は私のコメントで掲示同様

+2

私は既にASIHTTPRequestを使用しています。サポートされなくなったので、私はそれを離れています。それは同じ問題を抱えていますが、ヘッダーの設定は問題ありませんが、ストリーム全体が正しくない要求本体として送信されます。私は何とか正しいバイトオフセットにストリームを探し、残りのバイトだけを送る必要があります。 – JWood