最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS大文件的分片上傳和斷點(diǎn)上傳的實(shí)現(xiàn)代碼

 更新時(shí)間:2017年12月19日 11:36:52   作者:delegate  
這篇文章主要介紹了iOS大文件的分片上傳和斷點(diǎn)上傳的實(shí)現(xiàn)代碼,需要的朋友可以參考下

今天小編抽空給大家分享一些大文件的上傳的問題!斷點(diǎn)續(xù)傳和分片上傳。因?yàn)槲募^大(比如1G以上),必須要考慮上傳過程網(wǎng)絡(luò)中斷的情況。http的網(wǎng)絡(luò)請(qǐng)求中本身就已經(jīng)具備了分片上傳功能,當(dāng)傳輸?shù)奈募容^大時(shí),http協(xié)議自動(dòng)會(huì)將文件切片(分塊),但這不是我們現(xiàn)在說的重點(diǎn),我們要做的事是保證在網(wǎng)絡(luò)中斷后1G的文件已上傳的那部分在下次網(wǎng)絡(luò)連接時(shí)不必再重傳。所以我們本地在上傳的時(shí)候,要將大文件進(jìn)行分片,比如分成1024*1024B,即將大文件分成1M的片進(jìn)行上傳,服務(wù)器在接收后,再將這些片合并成原始文件,這就是分片的基本原理。斷點(diǎn)續(xù)傳要求本地要記錄每一片的上傳的狀態(tài),我通過三個(gè)狀態(tài)進(jìn)行了標(biāo)記(wait loading finish),當(dāng)網(wǎng)絡(luò)中斷,再次連接后,從斷點(diǎn)處進(jìn)行上傳。服務(wù)器通過文件名、總片數(shù)判斷該文件是否已全部上傳完成。

下面來說細(xì)節(jié):

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

分兩種情況,一種是在相冊庫里直接獲取,一種是調(diào)用相機(jī)。如果是通過UIImagePickerView來獲取(細(xì)節(jié)不詳述,網(wǎng)上一大堆),我們會(huì)發(fā)現(xiàn)當(dāng)你選定一個(gè)視頻的時(shí)候,會(huì)出現(xiàn)圖1的壓縮頁面,最后我們的app獲取的視頻就是這個(gè)經(jīng)過壓縮后的視頻(不是視頻庫里的原始視頻,這里有個(gè)注意點(diǎn),操作完該壓縮視頻后記得釋放,系統(tǒng)不會(huì)幫你釋放的,需要你手動(dòng)來操作,下面會(huì)說到),然后通過UIImagePickerView的協(xié)議方法中的- (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的區(qū)別,一個(gè)是有聲音的視頻文件,一個(gè)是沒有聲音的視頻文件,當(dāng)然還有Audio是只有聲音沒有視頻。UIImagePickerControllerMediaURL是視頻的URL(如果是相機(jī)拍攝的,那么這個(gè)就是原始拍攝得到的視頻;如果是在相冊庫里選擇的,那就是壓縮之后生成的視頻),注意這個(gè)URL不指向相冊庫,通過這個(gè)URL你可以操作這個(gè)視頻如刪除,拷貝等,可以獲取壓縮后的視頻的大小。UIImagePickerControllerReferenceURL是一個(gè)指向相冊的URL,官方的解釋是an NSURL that references an asset in the AssetsLibrary framework,通過這個(gè)URL,你可以獲取視頻的所有信息,包括文件名,縮略圖,時(shí)長等(通過ALAssetsLibrary里的assetsLibraryassetForURL:referenceURLresultBlock:)。

如果是相機(jī)拍攝的,注意兩個(gè)保存方法:圖片保存到相冊

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

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

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

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

2、將獲取到的文件分片

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

@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;//總片數(shù)
@property(nonatomic,copy)NSString* fileInfo;
@property(nonatomic,strong)UIImage* fileImage;//文件縮略圖
@property(nonatomic,strong) NSMutableArray* fileArr;//標(biāo)記每片的上傳狀態(tài)
@end

這樣我們就可以對(duì)每一個(gè)CNFile對(duì)象進(jìn)行操作了。

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

總片數(shù)的獲取方法:

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);

將文件分片,讀取每一片的數(shù)據(jù):

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

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

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

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

下一步就是上傳的過程:

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

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

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

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

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

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

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

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

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

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

這個(gè)操作實(shí)際上和上傳過程中斷網(wǎng)是一樣的,為了斷點(diǎn)續(xù)傳,在斷網(wǎng)或者暫停的時(shí)候,我們要將目前的進(jìn)度保存起來,以便下次上傳時(shí)略過前面已置finish的片。

然后還有一個(gè)問題,如果我們就這樣線性的一片一片上傳,實(shí)際上失去了分片上傳的意義,應(yīng)該結(jié)合多線程,使分片上傳過程并發(fā)執(zhí)行,同時(shí)上傳多片,這樣就提高了上傳效率,并充分利用了網(wǎng)絡(luò)帶寬。

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

最后注意一下,每上傳完一個(gè)視頻,去設(shè)置里看看你的app占用的存儲(chǔ)空間有沒有增大哦,如果你沒有處理那個(gè)生成的壓縮視頻,你會(huì)發(fā)現(xiàn)你的app的空間占用量是很大的。

總結(jié)

以上所述是小編給大家介紹的iOS大文件的分片上傳和斷點(diǎn)上傳,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法(Swift、OC)

    WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法(Swift、OC)

    這篇文章主要給大家介紹了關(guān)于WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • iOS實(shí)現(xiàn)壓縮圖片上傳功能

    iOS實(shí)現(xiàn)壓縮圖片上傳功能

    這篇文章主要介紹了iOS實(shí)現(xiàn)壓縮圖片上傳功能,iOS中常常需要打開相機(jī),選擇圖片上傳或者拍照上傳,如何實(shí)現(xiàn)壓縮圖片并上傳圖片,想要了解的朋友可以參考一下
    2016-04-04
  • IOS 使用NSAssert()和NSParameterAssert調(diào)試程序

    IOS 使用NSAssert()和NSParameterAssert調(diào)試程序

    這篇文章主要介紹了IOS 使用NSAssert()和NSParameterAssert調(diào)試程序的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • ios 不支持 iframe 的完美解決方法(兼容iOS&安卓)

    ios 不支持 iframe 的完美解決方法(兼容iOS&安卓)

    下面小編就為大家?guī)硪黄猧os 不支持 iframe 的完美解決方法(兼容iOS&安卓)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • iOS仿郵箱大師的九宮格手勢密碼解鎖

    iOS仿郵箱大師的九宮格手勢密碼解鎖

    這篇文章主要為大家詳細(xì)介紹了iOS仿郵箱大師的手勢密碼解鎖的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • iOS開發(fā)CGContextRef畫圖使用總結(jié)

    iOS開發(fā)CGContextRef畫圖使用總結(jié)

    這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)CGContextRef畫圖使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • ios開發(fā)一個(gè)好看的折線圖

    ios開發(fā)一個(gè)好看的折線圖

    本文文章教給大家在IOS開發(fā)中制作一個(gè)高顏值好看的折線圖,用處非常廣泛,有興趣的朋友參考下吧。
    2018-01-01
  • Objective-C 經(jīng)典字典數(shù)組排序 - 省市區(qū)

    Objective-C 經(jīng)典字典數(shù)組排序 - 省市區(qū)

    本文主要介紹Objective-C 字典數(shù)組排序,這里整理相關(guān)資料及實(shí)現(xiàn)示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • IOS Object-C 中Runtime詳解及實(shí)例代碼

    IOS Object-C 中Runtime詳解及實(shí)例代碼

    這篇文章主要介紹了IOS Object-C 中Runtime詳解及實(shí)例代碼的相關(guān)資料,OC中的對(duì)象其實(shí)在Runtime中都會(huì)用結(jié)構(gòu)體來表示,這個(gè)結(jié)構(gòu)體中包含了類名、成員變量列表、方法列表、協(xié)議列表、緩存等,需要的朋友可以參考下
    2017-03-03
  • iOS開發(fā)tips-UINavigationBar的切換效果

    iOS開發(fā)tips-UINavigationBar的切換效果

    這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)tips-UINavigationBar的切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

黄冈市| 邵武市| 庆云县| 刚察县| 马尔康县| 南漳县| 鄂伦春自治旗| 盐边县| 吉木萨尔县| 崇左市| 上杭县| 南康市| 赤峰市| 昭苏县| 江安县| 福贡县| 陆川县| 宁夏| 广宁县| 鄱阳县| 新闻| 淳化县| 龙南县| 马公市| 安新县| 石阡县| 宁化县| 盈江县| 密山市| 湖南省| 响水县| 攀枝花市| 布尔津县| 罗江县| 清镇市| 会泽县| 东海县| 玉山县| 若羌县| 凤阳县| 邵武市|