ios開發(fā)文件上傳,上傳到iOS

iOS開發(fā)中上傳Word文件之上傳Word文件到服務(wù)器

上篇文章已經(jīng)講了如何獲取Word 文件,這篇將如何上傳Word文件。

創(chuàng)新互聯(lián)建站從2013年開始,先為阿克陶等服務(wù)建站,阿克陶等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為阿克陶企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

1.從沙盒中獲取Word文件的路徑

2.將Word文件轉(zhuǎn)成NSData類型

3.使用Alamofire上傳文件

iOS大文件的分片上傳和斷點(diǎn)上傳

由于最近比較忙,所以一直沒有寫博客,現(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、首先獲取文件(音視頻、圖片)

分兩種情況,一種是在相冊(cè)庫里直接獲取,一種是調(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 = "";

UIImagePickerControllerReferenceURL = "assets-library://asset/asset.MOV?id=DEDA9406-3223-4F87-ABB2-98FB5F5EB9C4ext=MOV";

}

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

如果是相機(jī)拍攝的,注意兩個(gè)保存方法:圖片保存到相冊(cè)assetsLibrarywriteImageDataToSavedPhotosAlbum:UIImageJPEGRepresentation([infovalueForKey:UIImagePickerControllerOriginalImage],(CGFloat)1.0)metadata:nilcompletionBlock: failureBlock:

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

視頻保存到相冊(cè):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的空間占用量是很大的。

站在大牛的肩膀上開發(fā)。

iOS文件上傳

文件上傳的步驟

有時(shí)候項(xiàng)目需要要一次上傳多張圖片,可以將圖片壓縮成一個(gè)zip包,然后上傳這樣的方式來處理。文件壓縮和解壓工具 SSZipArchive

iOS開發(fā)上傳項(xiàng)目至github,以及使用.gitignore文件

1.在github官網(wǎng)( )注冊(cè)一個(gè)賬號(hào);

2.登錄賬號(hào),創(chuàng)建一個(gè)新的倉庫,如下圖

3.填寫倉庫名稱,配置倉庫相關(guān)信息

4.完成創(chuàng)建后,copy倉庫地址備用

5.在本地創(chuàng)建一個(gè)文件夾作為git本地倉庫文件夾,然后打開終端執(zhí)行以下命令

cd 到git本地倉庫文件夾中

git clone '上面copy的地址'

此時(shí)在git本地倉庫文件夾中會(huì)看到一個(gè)README文件,然后將自己的工程根目錄下的所有文件移到git本地倉庫文件夾中,然后在終端執(zhí)行以下命令

git add . //添加所有文件

git commit -m '添加了所有文件提交到本地倉庫' //提交

git push -u origin master //推送到遠(yuǎn)程git倉庫

此時(shí)去github網(wǎng)頁查看自己提交的項(xiàng)目,大功告成!

如果在創(chuàng)建倉庫時(shí),未勾選.gitignore選項(xiàng),則在使用git的過程中push時(shí),改動(dòng)的文件中會(huì)頻繁出現(xiàn)UserInterfaceState.xcuserstate文件。原因就是未使用.gitignore文件(就是git軟件要忽略的文件列表,如果要忽略某些文件,在Git工作區(qū)的根目錄下創(chuàng)建一個(gè)特殊的.gitignore文件,然后把要忽略的文件名填進(jìn)去,Git就會(huì)自動(dòng)忽略這些文件。),如何創(chuàng)建呢?接下來用我的實(shí)際經(jīng)驗(yàn)來給大家解決這個(gè)小問題咯????

cd到你的工程目錄下,然后 touch .gitignore

vi .gitigonre

project.xcworkspace

xcuserdata

UserInterfaceState.xcuserstate

project.xcworkspace/

xcuserdata/

UserInterface.xcuserstate

4.保存退出

然后執(zhí)行命令

git add .

git ommit -m '描述'

git push

成功后就不會(huì)出現(xiàn)UserInterfaceState.xcuserstate這種文件啦!

如果還是會(huì)出現(xiàn),則用以下命令

1.git status

查看當(dāng)前狀態(tài),會(huì)出現(xiàn)一個(gè)modifidy: UserInterfaceState.xcuserstate文件的路徑,咱們copy這個(gè)路徑;

分享文章:ios開發(fā)文件上傳,上傳到iOS
分享地址:http://m.kartarina.com/article10/dseeddo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司建站公司、網(wǎng)站排名、定制開發(fā)、自適應(yīng)網(wǎng)站、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
主站蜘蛛池模板: 狠狠躁天天躁无码中文字幕| 日韩精品中文字幕无码专区| 亚洲va无码va在线va天堂| 亚洲欧洲日产国码无码久久99| 亚洲Aⅴ无码专区在线观看q| 久久亚洲AV成人无码国产电影| 亚洲精品一级无码中文字幕| 中文字幕无码播放免费| 亚洲av无码不卡私人影院| 日韩精品久久无码人妻中文字幕 | 无码精品人妻一区| 亚洲精品中文字幕无码蜜桃| 一本天堂ⅴ无码亚洲道久久| 亚洲成a人片在线观看无码| 永久免费AV无码国产网站| 无码一区二区三区视频| 免费无码又爽又黄又刺激网站| 蜜桃AV无码免费看永久| 亚洲一区二区三区AV无码| 在线观看无码的免费网站| 久久久无码精品亚洲日韩按摩 | 精品无码专区亚洲| 91精品日韩人妻无码久久不卡| 一本加勒比HEZYO无码人妻| 无码专区6080yy国产电影| 亚洲人片在线观看天堂无码 | 亚洲精品无码专区在线| 日韩免费无码一区二区三区| 亚洲午夜无码久久久久| 国产成人无码av| 国产亚洲?V无码?V男人的天堂| 色国产色无码色欧美色在线| 亚洲精品天堂无码中文字幕| 无码丰满熟妇juliaann与黑人 | 久久久久亚洲精品无码系列 | 性色av极品无码专区亚洲| 精品亚洲AV无码一区二区三区 | 亚洲av无码专区在线播放 | 久久久久亚洲AV片无码| 亚洲成av人片在线观看无码不卡| 国产成人无码AV一区二区|