大容量のファイルの断片化の問題を要約し、壊れたアップロードを再開します。ファイル(1G以上など)が大きすぎるので、あなたは、ネットワーク障害のアップロードプロセスのケースを考慮する必要があります。それ自体がネットワークのHTTP要求のファイル転送が比較的大きい場合、既にフラグメントアップロード機能を持っている、HTTPプロトコルは自動的にファイルのセクション(ブロック)を移動させ、これは我々が焦点について話しているものではありません、我々はを行う必要があります1Gネットワーク障害が次回のネットワーク接続を再送信することなく、アップロードされた後のファイルの一部を保証します。だから我々は、例えば、1024×1024Bに分割され、断片化されるように、大きなファイルを、ローカルアップロードする際に、1Mのアップロードは、サーバーが受信した断片に大きなファイルについてです、その後、断片化され、元のファイルの中にこれらの作品を結合基本原理。HTTPは、Iは、ネットワーク障害が、再び接続された3つの状態、ブレークポイントからのアップロードを介して(待機ローディング仕上げ)タグ付けされた各部分の状態を記録するローカルアップロードを必要とします。ファイル名でサーバは、錠剤の合計数は、ファイルがすべて完成し、アップロードを持っているかどうかを判断します。
以下は詳細です。
1、最初のファイルを取得する(オーディオおよびビデオ、写真)
2つのケースは、一つはアルバムライブラリに直接あり、一つはカメラを呼んでいます。それはUIImagePickerViewで(詳細は、詳細にインターネットをたくさん記載されていない)、我々はあなたがビデオを選択すると、図1の圧縮されたページがあるだろうことがわかります、そして最終的に我々はアプリを取得取得する場合は、圧縮した後に、このビデオですビデオUIImagePickerViewで、その後、(オリジナルのビデオのないビデオライブラリは、あなたが圧縮されたビデオのリリースの動作を覚えた後のポイントは、システムを手動で操作するためにあなたは、私たちは以下について説明します必要がある、あなたがリリースする助けにはなりませんので注意があります)プロトコルメソッド- (無効):( imagePickerController UIImagePickerController *):(ピッカーdidFinishPickingMediaWithInfo NSDictionaryの *)情報情報取得ビデオ
fileInfo = {
UIImagePickerControllerMediaType = "public.movie"。
UIImagePickerControllerMediaURL = "ファイル:///private/var/mobile/Containers/Data/Application/2AAE9E44-0E6D-4499-9AC3-93D44D8342EA/tmp/trim.F36EC46C-4219-43C8-96A7-FA7141AB64D2.MOV";
UIImagePickerControllerReferenceURL = "資産ライブラリ:?//asset/asset.MOV ID = DEDA9406-3223-4F87-ABB2-98FB5F5EB9C4&EXT = MOV";
}
UIImagePickerControllerMediaTypeは、KUTTypeImage、KUTTypeMovieなどのファイルタイプを、選択されています。ここでは、ムービーとビデオの違いに注意して、ビデオファイルの音があり、ビデオファイルはもちろん、唯一のオーディオの音には、ビデオではありません、何の音ではありません。(カメラが、これはビデオによってキャプチャ元である場合、それはアルバムライブラリ、後に生成されたビデオ圧縮に選択されている場合)UIImagePickerControllerMediaURLは、ビデオのURLである注意URLは、このURLを介して、アルバムライブラリにポイントをしないこと。あなたは、圧縮されたビデオのサイズを取得することができ、など、コピー、削除などの映像を操作することができます。UIImagePickerControllerReferenceURLは、アルバムのURLへのポインタで、公式の説明は、NSURLすべてAssetsLibrary枠組みの中で資産が参照する情報 、 このURLを通じて、あなたが(ALAssetsLibrary等により、ファイル名、サムネイル、期間、などの映像を、得ることができますassetsLibrary assetForURL :referenceURL resultBlock :)。
カメラの場合、二つの記憶に注意を払う:アルバムへの保存写真assetsLibrary writeImageDataToSavedPhotosAlbum :UIImageJPEGRepresentation ([情報valueForKey :UIImagePickerControllerOriginalImage]、(CGFloat)1.0 )メタデータ:nilをcompletionBlock :failureBlock:
高忠実度の圧縮方法のNSData * UIImageJPEGRepresentation(UIImage *画像、CGFloatたcompressionQuality)の画像
:ビデオは、アルバムに保存されてassetsLibrary writeVideoAtPathToSavedPhotosAlbum:mediaUrl completionBlock:failureBlock:
ここでは、我々はすべての必要な書類やファイル情報を取得します。次のことは、ファイルの断片化にあります。
2、取得したファイルスライス
まず、私は、このクラスに保存されているように、Aファイルになります
@interface CNFile: NSObjectの
@property (アトミック、コピー)NSStringの*のfileType; //画像や動画
@Property (非アトミック、コピー)NSStringの* filePathに; // でファイルアプリのパス
@Property (非アトミック、コピー)NSStringの*ファイル名; // ファイル名
@Property (非アトミック、ASSIGN )NSInteger ファイルサイズ; // ファイルサイズ
@property(非アトミック、ASSIGN) NSInteger トランク; // シートの総数
@property (アトミック、コピー)NSStringの*のfileInfo。
@Property (非アトミック、強い)UIImage * fileImage; // ファイルのサムネイル
@property (非アトミック、強い)NSMutableArrayの* fileArr; // の各部分のタグアップロードステータス
@終わり
だから我々は、すべてのCNFileオブジェクトまで動作できること。
- (無効)readDataWithChunk :( NSInteger )チャンクファイル:( CNFile *)ファイル{
シートの合計数を取得する方法:
INT =オフセット1024 * 1024 (サイズ1Mのそれぞれ)
NSInteger チャンク=(ファイルファイルサイズ%1024 == 0 ?)((INT 。)(ファイルのファイルサイズ/ 1024 * 1024 )):((INT 。)(ファイルのファイルサイズ/(1024 * 1024 )+ 1 ))。
NSLog (@ "チャンク=%ldの"、(長い)チャンク)。
ファイルの断片化は、データが各1読み込みます。
NSDataの*データ;
NSFileHandle * readHandle = [ NSFileHandle fileHandleForReadingAtPath:ファイル。filePathに];
[readHandle seekToFileOffset :オフセット*チャンク]。
データ= [readHandle readDataOfLength :オフセット]。
}
だから我々は、アップロードするデータのすべての部分を取得し、その後フィルムが既に存在するかどうか、サーバーに尋ねること
(方法- (無効)ifHaveData :( NSDataの*)データWithChunk :( NSInteger )チャンクファイル:( CNFile *)ファイル)
現在、チャンク+ 1に、サーバは、シートを提示しなくなるまで、次のいずれかを読み取るために、上記の方法を繰り返した場合、シートは、データがアップロードされます。ファイルが完成しアップロードすべてを持っているかどうかを判断地元に関連します。この方法では、(待機積載仕上げ)のチャンクのアップロードステータスの設定に注意してください。
次のステップでは、アップロードのプロセスです。
- (無効)uploadData :( NSDataの*)データWithChunk :( NSInteger )チャンクファイル:( CNFile *)ファイル。
成功したアップロードサーバは、フィルムを返した後、我々はやるべきことがたくさんあります。
1)最初に成功した映画のアップロードされたフラグに置か仕上げを
[ファイル。fileArr replaceObjectAtIndex:チャンクwithObject:@「仕上げ」];
すべてのピース場合は2)を参照してフラグが配置されている仕上げをすでにfinishi場合は、ファイルのアップロードが完了したことを示す、、、その後、ファイルを削除したファイルまたは次の終わりをアップロードします。
用 (NSIntegerの J = 0 ; J <チャンク; J ++){
もし (J ==チャンク||((J ==チャンク- 1 )&&([ファイル。fileArr [J] isEqualToString :@ "仕上げ" ])))
[私 DELETEFILE :ファイル。filePathに];
[私 readNextFile ]。
}
あなたがフィニッシュを持っていない場合は3)、その後、待機するかどうかでローカルフラグの次のチャンクを見ます
NSLog (@ " のビュー%のLDのシート状態"、チャンク+ 1 )。
用(NSInteger iはチャンク+ = 1 ; I <チャンク; I ++)
{
NSStringの*フラグ= [ファイル。fileArr objectAtIndex :i]の;
もし ([フラグisEqualToString :@ "待機" {])
[私は readDataWithChunk :I ファイル名を:fileNameにするファイル:ファイル];
休憩;
}
}
)2.5を有していてもよく、ステップ2と3との間に休止アップロードか否かを判断します
もし(me.isPause == YES )
{
// 現在はローカルに保存されたいくつかのファイルの最初のいくつかの作品を読んで
[ 自己 saveProgressWithChunk:チャンクファイル:ファイル];
リターン ;
}
この操作は、アップロードプロセスが中断ネットワークであるとほぼ同じであるHTTP、断線または一時停止するために、我々は保存された現在の進行状況にしたい、次のピースの仕上げのアップロードの前に配置されているに進んでください。
そして問題は、私達はちょうどアップロード断片化の意味を失っ実際には線形の一片を、アップロードした場合、それは同時に、マルチスレッドなので、その部分のアップロード処理と組み合わせる必要があり、があります同時にので、効率のアップロードを向上させること、複数の作品をアップロードおよびネットワーク帯域幅をフルに活用。
dispatch_async(dispatch_queue_tキュー、^ {
[私は readDataWithChunk :チャンク]。
})
最後に、ノートでは、それぞれのアプリが占めるスペースの量を見つけることができます、あなたが圧縮されたビデオの世代に対処していない場合は、ああ増加しないストレージ・スペースの量にアプリの設定を見に行く、動画をアップロードすることは非常にされて終了します大規模な。
詳細はこちらの記事を参照してください。http://blog.ncmem.com/wordpress/2019/08/12/%e5%a4%a7%e6%96%87%e4%bb%b6%e6%96%ad%e7 %82%B9%E7%BB %の広告%E4%BC%A0-2 /