分片上传
(断点续上传) 主要是为了保证在网络中断后1G的资源文件已上传的那部分在下次网络连接时不必再重传。所以我们本地在上传的时候,要将大文件进行切割分片,比如分成1024*1024B
,即将大文件分成1M
的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是 分片
的基本原理。断点续传要求本地要记录每一片的上传的状态,我通过三个状态进行了标记(waiting loading finish)
,当网络中断,再次连接后,从断点处进行上传。服务器通过文件名、总片数判断该文件是否已全部上传完成。
文件读取一般主要用于读取每一个文件片的大小,需要利用NSFileHandle来处理。
//从当前节点开始读取指定的长度数据
- (NSData *)readDataOfLength:(NSUInteger)length;
//跳到指定文件的偏移量
- (void)seekToFileOffset:(unsigned long long)offset;
//打开一个文件准备读取
+ (nullable instancetype)fileHandleForReadingAtPath:(NSString *)path;
首先定义一个分片文件对象FileFragment
存储每一片的信息。如下:
NSUInteger fragmentSize
片的大小NSUInteger fragmentOffset
片的偏移量NSUInteger fragmentIndex
片的索引FileUploadStatus uploadStatus
片的上传状态NSString *fileId
所属大文件的fileIdNSInteger totalFileFragment
所属大文件总共的片数NSInteger totalFileSize
所属大文件的大小NSString *filePath
所属大文件的存放路径
大文件分片上传,在上传每片文件的时候要配置以下参数传给服务端。这样服务端可以知道文件的大小和片数来判断大文件是否上传完成。通过收到第几片可以进行数据的拼接。
@"id": 大文件ID,
@"totalSize" : 大文件的总大小,
@"blockTotal": 总共分了多少片,
@"blockNo" : 分片的索引,第几片
每上传完一个分片的数据就对该分片进行状态标记,同时更新进度条。
通过使用dispatch_group_t来控制当所有的分片都上传完成之后来判断是不是所有的分片都是上传成功。如果都上传成功则大文件上传完毕。如果查询有哪个分片上传失败则进行重新上传。 可以使用信号量来控制分片能够同步进行。 如果是多个大文件,可以考虑通过NSOperationQueue将大文件放进一个队列里面,可以使用串行队列。挨个上传。