2013-11-14 1 views
9

NSURLSessionを使用してAsset Libraryからサーバーに写真をアップロードする際にいくつか問題があります。NSURLセッションとストリームをバックグラウンドでアップロード

最初にNSURLSessionはストリーミングアップロードをサポートしていません。 Appleのマニュアルは、バックグラウンドセッションに対してのみuploadTaskWithRequest:fromFile:の使用に関するあらゆる情報が含まれていないので、本当に奇妙だ

Terminating app due to uncaught exception 'NSGenericException', reason: 'Upload tasks in background sessions must be from a file' 

@property (nonatomic, strong) NSURLSession *uploadSession; 

... 

_uploadSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration 
       backgroundSessionConfiguration:kUploadBackgroundURLSessionIdentifier] delegate:self delegateQueue:nil]; 

... 

NSURLSessionUploadTask *task = [self.uploadSession uploadTaskWithStreamedRequest:URLRequest]; 

これは例外である:それを使用しようとしたとき、私は例外が発生しました。本当に巨大な動画ファイルをアセットライブラリからアップロードしたいのですが?以前にtmpディレクトリに保存する必要がありますか?

唯一の理由は、とにかくuploadTaskWithRequest:fromFile:を使用するように見えますか?しかし、私は、アップロードプロセスが中断され、次の部分をバックグラウンドでアップロードし始めると、サーバーがファイルの内容を知ることがどのようにしてアップロードされているのかという質問がありますか?

私はそれを何かするべきでしょうか?以前に開始されたファイルの一部をアップロードし続ける場合は、以前はContent-RangeをURL要求で使用しました。今はできません - アップロードタスクを作成する前にURLリクエストを作成して、NSURLSessionのように自動的にそのようなことをする必要がありますか?

誰かが既にそういったことをしていますか?おかげ

+2

ドキュメントを読むと、バックグラウンド用にファイルを用意する必要がありました。あなたの質問が分からない - ファイルが部分的にしかアップロードされておらず、サービスがどれくらい受け取ったのかがわかっている場合は、ファイルをトリムして未送信部分を再送することができます。私はこれをやっている経験はありませんが、実行可能に思えます。 –

+0

はい、すべて動作可能ですが、資産ライブラリから膨大な動画をアップロードしたい場合は、アプリケーションフォルダに十分な領域があればそれをコピーしてから、コピーを開始してから時間をかけなければならないという問題があります何が既にアップロードされているかをチェックし、ファイルをトリムし、新しいリクエストを開始する。しかし、Appleのドキュメントは、各ファイルごとに1つのタスクを作成する必要があることを伝えています。 – gN0Me

+0

私は資産ライブラリの経験がありません。ビデオを取得するために使用するフレームワークやクラスは何ですか? –

答えて

1

ALAsset *asset = [cameraRollUploadImages objectAtIndex:startCount]; 
ALAssetRepresentation *representation = [asset defaultRepresentation]; 

// create a buffer to hold the data for the asset's image 
uint8_t *buffer = (Byte *)malloc(representation.size);// copy the data from the asset into the buffer 
NSUInteger length = [representation getBytes:buffer 
            fromOffset:0 
             length:representation.size 
             error:nil]; 

// convert the buffer into a NSData object, free the buffer after 
NSData *image = [[NSData alloc] initWithBytesNoCopy:buffer 
              length:representation.size 
             freeWhenDone:YES]; 
+6

ええ、それはまさに私たちがやっていることです。しかし、ユーザーがAssetsLibraryに巨大なビデオファイルを持っている場合には問題があります – gN0Me

0

appフォルダにNSDataのに変換してコピーし、書き込み今、手立てotherthanローカルファイルシステムまたは一時ディレクトリに画像を保存するには、ありません。

次のコードは、exifタグでデータが失われないようにします。 (ALAsset => NSData)

ALAssetRepresentation *assetRepresentation = [(ALAsset *)assetBeingUploaded defaultRepresentation]; 
uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t)*[assetRepresentation size]); 
NSUInteger buffered = 0; 
if (buffer != NULL) 
buffered = [assetRepresentation getBytes:buffer fromOffset:0.0 length:assetRepresentation.size error:nil]; 
self.imageBeingUploaded = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 

バックグラウンドセッションのアップロードタスクは、完了ハンドラをサポートしていません。私達はのために行く必要があります。、我々は場合にレスポンスヘッダや本文を得るのですか

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; 

私は疑う私たちは、ファイルを使用して要求を背景セッション& uploadtaskを使用している場合は?

0

NSStreamを使用してファイルをアセットライブラリからテンポラリフォルダにコピーするNSOperationを作成すると、大量のファイルがクラッシュしたり、操作が完了するとクラッシュすることはありませんその一時ファイルのアップロード。アップロードが完了すると、それを削除します。

私の場合、マルチパート形式でファイルを送信する必要があります。一時ファイルの作成が必要ですが、大容量のファイルをアップロードする際に問題が発生します。

0

ファイルフォーマットをアップロードする必要があるバックグラウンドでNSDataをアップロードすることはできません。ディレクトリパスで作成することができます

関連する問題