2017-11-17 1 views
0

NSURLSessionのuploadTaskWithRequest:FromFile:を使用して、バックグラウンドでファイルをアップロードしています。これはうまくいきますが、ファイルの特定の部分だけをアップロードしたいと思います。だから私はファイルの特定の範囲をアップロードするアップロードタスクを取得しようとしています。NSURLSessionUploadTask - コンテンツの範囲を指定します。

私は例えば、コンテンツ・レンジとレンジヘッダを設定しようとしました。:

[request addValue:@"bytes 2367488-7056719/7056719" forHTTPHeaderField:@"Content-Range"]; 
[request addValue:@"4689232" forHTTPHeaderField:@"Content-Length"]; 

しかし、これは動作しません - アップロードセッションはとにかくファイル全体を送信します。 Rangeヘッダーを保持し、Content-Lengthヘッダーをファイル全体のサイズで上書きします。

これを行うことができますか?

バックグラウンドアップロードタスクでは、アップロードの再開に関する参照がありました。これは本質的には同じものです(例:this質問)。しかし、特定の範囲を送信するための直接参照はありません。

これまでの私の唯一の解決策は、ファイルの切り刻んだバージョンをディスクに書き込むことです。私はそれを避けたいと思います。

+0

私はRFCを見ていますが、Rangeヘッダーをアップロードに使用できることは明らかではありません。あなたがしていることが合法であることを証明できますか? – matt

+0

@matt - https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16によると、「部分的なボディーエンティティ」のPUTでContent-Rangeを使用することがあります。私がやっている。 RangeとContent-Rangeの両方を設定しようとしましたが、どちらも効果がありません –

+0

より正確だと思われるContent-Rangeヘッダーを表示するための質問を修正しました。 –

答えて

0

NSURLSessionは、送信するものを決定する際にヘッダーを気にしません。あなたが与えたブロブを送信し、ファイルの場合は、Content-Lengthをファイルのサイズ(該当する場合は、エンコード/圧縮されたもの)に設定します。

ファイルの途中からnバイトを送信する場合は、それらのバイトを自分のファイルに書き込むか、ストリーミング要求を使用してそれらのバイトのみを提供する必要があります。

後者のアプローチを行うには、ファイルストリームでアップロード要求を作成し、NSStreamオブジェクトにキャストされたCFStreamオブジェクトのバインドされたペアを使用します。次に、ストリームを開き、ストリームデリゲートにより多くのバイトを提供するように要求された場合は、それらを提供し、書き込み呼び出しの戻り値をチェックして、次にバイトを要求するときにスキップするバイト数を決定します。

+0

明確にするために、ストリーミングアプローチはバックグラウンドHTTP転送では機能しませんか、それともその方法を知っていますか?ありがとうございました –

+0

私の知る限りでは、(uploadTaskWithStreamedRequest: 'で作成された)ストリーミングリクエストは、バックグラウンドタスクでも動作すると思われます。 OSは、再試行が必要な場合に、新しいストリームを提供するためにアプリを暗く/バックグラウンドで再起動します。それがうまくいかない場合は、その機能に対してバグを報告してから、ドキュメントに対してもう1つのバグを報告してください。初期のiOS 7のアップデートでは、ストリーミングアップロードがバックグラウンドセッションでは動作しないバグがあったかもしれないと思うが、AFAIKはバグだった。 – dgatwood

関連する問題