iOS 断点上传文件的实现方法

2020-01-21 03:12:13王振洲

项目开发中,有时候我们需要将本地的文件上传到服务器,简单的几张图片还好,但是针对iPhone里面的视频文件进行上传,为了用户体验,我们有必要实现断点上传。其实也不是真的断点,这里我们只是模仿断点机制。

需求

既然需要上传文件,那最好要有一个上传列表界面,方面用户对上传中的文件进行实时管理。这里我简单搭建了一个上传列表界面,如下图:

ios,断点,上传,文件,文件断点上传

该界面实现的功能:左滑删除,单击暂停、取消,清空列表。退出该界面可后台上传,暂停再次开始或则app被kill掉依旧支持续传。上传完成、删除正在上传文件、清空上传列表都会将本地缓存的文件删除。

实现方法

客户端把大文件切片,服务器接收完所有片后拼接成一个完整文件。

1.缓存文件

录制视频或者选择系统相册中的视频后需要写入文件到沙盒。因为如果不缓存,只是通过路径来获取视频,手机中的视频可能被删除。如果是选择系统自带压缩的话,文件只是存在了系统的某个cache文件夹下,系统可能会清理该文件件,那么下次再次根据路径获取视频的时候,就找不到了。

缓存文件就不再细说,在/Library/Caches 目录下面新建一个文件夹Video用来缓存视频文件。之前看到用的文章存到了Documents文件夹下,我是不建议的,之所以在这个目录下面,是因为系统不会清理这个文件夹,而且在进行iCloud备份时也不会备份该文件夹下的内容。如果把一个很大的视频文件放到Documents文件夹下,必然给用户带来不便。还有一点需要注意,正如上面所描述,上传完成、删除正在上传文件、清空上传列表都必须将本地缓存的文件删除。不然会导致app占用系统太多的空间,用户看到后直接把你的app卸载了。

为了防止重名,我在文件名中拼上了时间戳。


#pragma mark- write cache file
- (NSString *)writeToCacheVideo:(NSData *)data appendNameString:(NSString *)name {
 NSString *cachesDirectory = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
 NSString *createPath = [cachesDirectory stringByAppendingPathComponent:@"video"];
 NSFileManager *fileManager = [[NSFileManager alloc] init];
 [fileManager createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil];
 NSString *path = [cachesDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/video/%.0f%@",[NSDate date].timeIntervalSince1970,name]];
 [data writeToFile:path atomically:NO];
 return path;
}

这里随便说下沙盒目录下几个文件夹的作用。