亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS大文件的分片上傳和斷點上傳的實現代碼

2019-10-21 18:42:57
字體:
來源:轉載
供稿:網友

今天小編抽空給大家分享一些大文件的上傳的問題!斷點續傳和分片上傳。因為文件過大(比如1G以上),必須要考慮上傳過程網絡中斷的情況。http的網絡請求中本身就已經具備了分片上傳功能,當傳輸的文件比較大時,http協議自動會將文件切片(分塊),但這不是我們現在說的重點,我們要做的事是保證在網絡中斷后1G的文件已上傳的那部分在下次網絡連接時不必再重傳。所以我們本地在上傳的時候,要將大文件進行分片,比如分成1024*1024B,即將大文件分成1M的片進行上傳,服務器在接收后,再將這些片合并成原始文件,這就是分片的基本原理。斷點續傳要求本地要記錄每一片的上傳的狀態,我通過三個狀態進行了標記(wait loading finish),當網絡中斷,再次連接后,從斷點處進行上傳。服務器通過文件名、總片數判斷該文件是否已全部上傳完成。

下面來說細節:

1、首先獲取文件(音視頻、圖片)

分兩種情況,一種是在相冊庫里直接獲取,一種是調用相機。如果是通過UIImagePickerView來獲?。毠澆辉斒?,網上一大堆),我們會發現當你選定一個視頻的時候,會出現圖1的壓縮頁面,最后我們的app獲取的視頻就是這個經過壓縮后的視頻(不是視頻庫里的原始視頻,這里有個注意點,操作完該壓縮視頻后記得釋放,系統不會幫你釋放的,需要你手動來操作,下面會說到),然后通過UIImagePickerView的協議方法中的- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info獲取視頻的Info

fileInfo = {UIImagePickerControllerMediaType = "public.movie";UIImagePickerControllerMediaURL = "file:///private/var/mobile/Containers/Data/Application/2AAE9E44-0E6D-4499-9AC3-93D44D8342EA/tmp/trim.F36EC46C-4219-43C8-96A7-FA7141AB64D2.MOV";UIImagePickerControllerReferenceURL = "assets-library://asset/asset.MOV?id=DEDA9406-3223-4F87-ABB2-98FB5F5EB9C4&ext=MOV";}

UIImagePickerControllerMediaType是選取文件的類型,如KUTTypeImage,KUTTypeMovie。這里注意一下movie和video的區別,一個是有聲音的視頻文件,一個是沒有聲音的視頻文件,當然還有Audio是只有聲音沒有視頻。UIImagePickerControllerMediaURL是視頻的URL(如果是相機拍攝的,那么這個就是原始拍攝得到的視頻;如果是在相冊庫里選擇的,那就是壓縮之后生成的視頻),注意這個URL不指向相冊庫,通過這個URL你可以操作這個視頻如刪除,拷貝等,可以獲取壓縮后的視頻的大小。UIImagePickerControllerReferenceURL是一個指向相冊的URL,官方的解釋是an NSURL that references an asset in the AssetsLibrary framework,通過這個URL,你可以獲取視頻的所有信息,包括文件名,縮略圖,時長等(通過ALAssetsLibrary里的assetsLibraryassetForURL:referenceURLresultBlock:)。

如果是相機拍攝的,注意兩個保存方法:圖片保存到相冊

assetsLibrarywriteImageDataToSavedPhotosAlbum:UIImageJPEGRepresentation([infovalueForKey:UIImagePickerControllerOriginalImage],(CGFloat)1.0)metadata:nilcompletionBlock: failureBlock:

高保真壓縮圖片的方法NSData * UIImageJPEGRepresentation ( UIImage *image, CGFloat compressionQuality)

視頻保存到相冊:assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:MediaURL completionBlock:failureBlock:

到這里,我們就獲取了所有需要的文件以及文件信息。下面要做的就是將文件分片。

2、將獲取到的文件分片

首先,我將獲取到的文件保存在這這樣一個類中

@interface CNFile :NSObject@property(nonatomic,copy)NSString* fileType;//image or movie@property(nonatomic,copy)NSString* filePath;//文件在app中路徑@property(nonatomic,copy)NSString* fileName;//文件名@property(nonatomic,assign)NSIntegerfileSize;//文件大小@property (nonatomic,assign)NSIntegertrunks;//總片數@property(nonatomic,copy)NSString* fileInfo;@property(nonatomic,strong)UIImage* fileImage;//文件縮略圖@property(nonatomic,strong) NSMutableArray* fileArr;//標記每片的上傳狀態@end

這樣我們就可以對每一個CNFile對象進行操作了。

-(void)readDataWithChunk:(NSInteger)chunk file:(CNFile*)file{

總片數的獲取方法:

intoffset =1024*1024;(每一片的大小是1M)NSIntegerchunks = (file.fileSize%1024==0)?((int)(file.fileSize/1024*1024)):((int)(file.fileSize/(1024*1024) +1));NSLog(@"chunks = %ld",(long)chunks);

將文件分片,讀取每一片的數據:

NSData* data;NSFileHandle*readHandle = [NSFileHandlefileHandleForReadingAtPath:file.filePath];[readHandleseekToFileOffset:offset * chunk];data = [readHandlereadDataOfLength:offset];}

這樣我們就獲取了每一片要上傳的數據,然后詢問服務器,該片是否已經存在

(方法-(void)ifHaveData:(NSData*)data WithChunk:(NSInteger)chunk file:(CNFile*)file)

,如果存在,令chunk+1,重復上面的方法讀取下一片,直到服務器不存在該片,那么上傳該片數據。在這個方法中注意設置該chunk的上傳狀態(wait loading finish),這將關系到本地判斷該文件是否已全部上傳完成。

下一步就是上傳的過程:

-(void)uploadData:(NSData*) data WithChunk:(NSInteger) chunk file:(CNFile*)file;

在服務器返回該片上傳成功后,我們要做的事有很多:

1)先將已經成功上傳的本片的flag置finish

[file.fileArrreplaceObjectAtIndex:chunk withObject:@“finish"];

2)查看是否所有片的flag都已經置finish,如果都已經finishi,說明該文件上傳完成,那么刪除該文件,上傳下一個文件或者結束。

for(NSIntegerj =0; jif(j == chunks || ((j == chunks -1)&&([file.fileArr[j]isEqualToString:@"finish"])))[medeleteFile:file.filePath];[mereadNextFile];}

3)如果沒有都finish,那么看本地下一chunk對用的flag是否是wait

NSLog(@"查看第%ld片的狀態",chunk+1);for(NSIntegeri = chunk+1;i < chunks;i++){NSString* flag = [file.fileArrobjectAtIndex:i];if([flagisEqualToString:@"wait"]) {[mereadDataWithChunk:ifileName:fileNamefile:file];break;}}

在第2、3步之間可以有一個 2.5)判斷是否暫停上傳

if(me.isPause ==YES){//將目前讀到了第幾個文件的第幾片保存到本地[selfsaveProgressWithChunk:chunk file:file];return;}

這個操作實際上和上傳過程中斷網是一樣的,為了斷點續傳,在斷網或者暫停的時候,我們要將目前的進度保存起來,以便下次上傳時略過前面已置finish的片。

然后還有一個問題,如果我們就這樣線性的一片一片上傳,實際上失去了分片上傳的意義,應該結合多線程,使分片上傳過程并發執行,同時上傳多片,這樣就提高了上傳效率,并充分利用了網絡帶寬。

dispatch_async(dispatch_queue_t queue, ^{[mereadDataWithChunk: chunk];})

最后注意一下,每上傳完一個視頻,去設置里看看你的app占用的存儲空間有沒有增大哦,如果你沒有處理那個生成的壓縮視頻,你會發現你的app的空間占用量是很大的。

總結

以上所述是小編給大家介紹的iOS大文件的分片上傳和斷點上傳,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产综合色香蕉精品| 色婷婷综合久久久久中文字幕1| 欧美亚洲伦理www| 91高清在线免费观看| 久久视频国产精品免费视频在线| 欧美电影在线免费观看网站| 亚洲国产一区自拍| 国产精品视频区| 亚洲黄页视频免费观看| 国产丝袜精品第一页| 色偷偷偷综合中文字幕;dd| 日韩精品在线观看视频| 亚洲国产91色在线| 欧美精品久久久久久久| 欧美激情中文字幕乱码免费| 欧美日韩亚洲视频一区| 亚洲国产精品中文| 亚洲欧洲xxxx| 欧美性猛交xxxx乱大交极品| 日韩av影视在线| 日韩欧美精品网站| 性欧美长视频免费观看不卡| 国产欧美日韩精品专区| 精品动漫一区二区| 91国产一区在线| 午夜精品久久久久久久99热| 美女国内精品自产拍在线播放| 最近的2019中文字幕免费一页| 成人有码视频在线播放| 欧美视频中文字幕在线| 北条麻妃一区二区三区中文字幕| 2019中文在线观看| 久久伊人精品一区二区三区| 性金发美女69hd大尺寸| 视频一区视频二区国产精品| 91亚洲精品久久久久久久久久久久| 最近2019年好看中文字幕视频| 欧美极品在线视频| 伊人男人综合视频网| 97av在线视频| 91网站免费看| 久久视频在线视频| 国产精品久久色| 国产在线观看一区二区三区| 日韩中文在线视频| 日韩av电影在线免费播放| 日韩视频欧美视频| 亚洲另类激情图| 久久久久亚洲精品| 国产精品露脸av在线| 亚洲天堂色网站| 欧美激情成人在线视频| 亚洲精品久久久久中文字幕欢迎你| 亚洲第一精品夜夜躁人人躁| 欧美性猛交xxxx黑人| 久热精品视频在线观看一区| 97热在线精品视频在线观看| 欧美性videos高清精品| 不卡av电影院| 国产精品久久久久久久午夜| 国产精品久久久久9999| 国产精品白嫩初高中害羞小美女| www.欧美免费| 97视频在线观看免费高清完整版在线观看| 久久国产精品首页| 欧美日韩免费在线观看| 亚洲老板91色精品久久| 欧美在线一级视频| 久久精品国产欧美激情| 亚洲精品日韩久久久| 亚洲成人亚洲激情| 国产日韩欧美中文在线播放| 亚洲福利在线观看| 92看片淫黄大片欧美看国产片| 欧美日韩亚洲一区二区| 一本大道亚洲视频| 久久精品国产精品亚洲| 91国自产精品中文字幕亚洲| 久久影视电视剧免费网站清宫辞电视| 久久久久久香蕉网| 国产视频观看一区| 欧美大胆在线视频| 中文字幕亚洲第一| 亚洲桃花岛网站| 欧美日韩成人在线视频| 欧美日韩精品在线观看| 久久精品中文字幕免费mv| 久久影院在线观看| 久久国产精品久久精品| 欧美一级高清免费播放| 久久精品亚洲精品| 97成人精品视频在线观看| 97超级碰碰人国产在线观看| 精品国产一区二区在线| 久久男人资源视频| 亚洲人成在线观看| 欧美极品美女电影一区| 福利视频一区二区| www.日韩欧美| 精品国产美女在线| 亚洲一区二区三区久久| 亚洲男人天堂网站| 欧美又大粗又爽又黄大片视频| 最新国产精品亚洲| 国产成人综合一区二区三区| 久久精品福利视频| 91探花福利精品国产自产在线| 亚洲黄色免费三级| 在线成人激情黄色| 国产精品偷伦视频免费观看国产| 国语自产精品视频在线看抢先版图片| 精品亚洲男同gayvideo网站| 亚洲一区二区三区成人在线视频精品| 欧美成人剧情片在线观看| 国产一区二区在线免费视频| 成人在线视频网| 色妞色视频一区二区三区四区| 国产一区二区三区精品久久久| 精品无人区乱码1区2区3区在线| 国产精品91在线观看| 国产一区二区三区在线视频| 国产91在线播放九色快色| 国产精品香蕉在线观看| 成人福利网站在线观看| 欧美性猛交xxxxx免费看| 欧美精品在线免费播放| 欧美日韩在线观看视频| 国产精品久久久久77777| 国产亚洲欧洲高清一区| 亚洲国模精品一区| 精品福利免费观看| 亚洲va欧美va国产综合剧情| 欧美裸身视频免费观看| 色无极亚洲影院| 日韩毛片在线观看| 日本道色综合久久影院| 亚洲欧美日韩中文在线制服| 国产精品狠色婷| 亚洲自拍偷拍福利| 亚洲大胆美女视频| 亚洲精品v天堂中文字幕| 日韩理论片久久| 久久精品国产清自在天天线| 日韩在线中文字幕| 国产日韩亚洲欧美| 韩曰欧美视频免费观看| 97热精品视频官网| 亚洲国产精品久久久久秋霞蜜臀| 久久精品99久久香蕉国产色戒| 日韩精品在线免费观看视频| 亚洲欧美三级在线| 国产精品入口日韩视频大尺度| 亚洲天堂第二页| 欧美最猛性xxxxx(亚洲精品)| 日韩精品极品在线观看播放免费视频| 亚洲欧洲在线观看| 亚洲专区中文字幕| 午夜精品久久久久久久久久久久久| 午夜精品美女自拍福到在线| 一区二区三区亚洲| 久久久久久久爱| 日韩乱码在线视频| 亚洲区中文字幕| 91系列在线播放|