13

私は現在、単純な http 投稿を介して iPhone から Web サービスに大きなビデオ ファイルをアップロードするためのアプリケーションに取り組んでいます。現時点では、NSURLRequest を作成し、リクエストをロードする前にすべてのビデオ ファイル データをプリロードしています。ファイルがかなり大きい場合、これは当然大量の RAM を消費します。

基本的に私の質問は次のとおりです。データをストリーミングしたり、Webサーバーに変更を加えずにチャンクでロードしたりする正しい方法はありますか?

ありがとう。

明確にするために編集: iPhoneから Web サーバーに大きなマルチパート/フォーム データをストリーミングする方法を探しています。その逆ではありません。

回答を受け入れた後の編集:アップルには、この正確な目的のために書かれた気の利いたソースコードがあり、大きなファイル自体だけでなく、投稿に追加データを追加していることがわかった. 誰かがそれを必要とする場合に備えて: SimpleURLConnections - PostController.m

さらに別の編集:アップルのソースコードを使用しているときに、wiresharkでさえデバッグに役立たない、非常に愚かで醜い問題に遭遇しました。一部の Web サーバーは、引用符の間に境界文字列が宣言されている場合 (りんごの例のように)、境界文字列を理解できません。Apache Tomcat で問題が発生し、引用符を削除するとうまくいきました。

4

3 に答える 3

15

でご利用いただけNSInputStreamますNSMutableURLRequest。例えば:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:uploadURL];
NSInputStream *stream = [[NSInputStream alloc] initWithFileAtPath:filePath];
[request setHTTPBodyStream:stream];
[request setHTTPMethod:@"POST"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]);
}];
于 2012-09-27T17:41:39.967 に答える
3

を使用しNSInputStreamて、 経由で投稿するデータを提供できます-[NSMutableURLRequest setHTTPBodyStream:]。これは、ファイルから読み取る入力ストリームである可能性があります。connection:needNewBodyStream:システムがデータを再送信する必要がある場合に備えて、URL 接続デリゲートにメソッドを実装して、開かれていない新しいストリームを提供する必要がある場合があります。

于 2012-09-27T17:42:12.213 に答える
2

これを行う 1 つの方法は、ファイルと連携して非同期 NSInputStream を使用することです。非同期接続から追加のデータを要求された場合は、ファイルからデータを読み込みます。これを行うにはいくつかの方法があります。

  • UNIX/BSD インターフェース。open (または fopen)、malloc、read を使用し、malloc されたデータから NSData オブジェクトを作成します。

  • わかっている場合は、上記を mmap() で使用します

  • Foundation クラスの NSFileHandle API を使用して、ObjectiveC を使用して多かれ少なかれ同じことを行います

ストリームについては、「ストリーム プログラミング ガイド」を参照してください。これがうまくいかない場合は、MKNetworkKitなど、ファイルをアップロードできるオープン ソース プロジェクトがたくさんあります。

于 2012-09-27T18:17:08.313 に答える