iOS大文件的分片上传和断点上传的实现代码

2020-01-21 03:13:36王旭

如果是相机拍摄的,注意两个保存方法:图片保存到相册


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,说明该文件上传完成,那么删除该文件,上传下一个文件或者结束。