iOS中的上传、下载流程心得

访问相册

1.  判断资源库是否有效
2.  创建imagePickerController 设置代理 弹出视图控制器
3.  实现协议方法

> iOS10 访问系统相册需要在info.plist中添加`Privacy - Photo Library Usage Description`KEY并附上该KEY的相关描述,例如`访问相册`

上传文件

 服务器代码

服务器端
    //获得上传的数据的长度"
int length = request.getContentLength();"
    //创建⼀一个长度为length的字节数组,该字节数组存放上传的数据"
byte buffer[] = new byte[length];"
    //获得servlet的输⼊入流,来读取数据"
ServletInputStream input = request.getInputStream();"
for (int i = 0; i < length; i++)"
{"  //read是从输⼊入流中读取数据,而且每次读取一个字节"
buffer[i] = (byte) input.read();"
}input.close();
    //创建⼀一个⽂文件输出流,把数据存到本地,需要⽂文件路径
FileOutputStream output = new FileOutputStream("/Users/xxxx/Desktop/upload.jpg");
output.write(buffer);
output.close();

 小文件

1. 构建URL
2. 构建Request   因为是上传需要在请求体中添加请求数据 使用NSMutableURLRequest
   1. 设置请求方法
3. 创建会话配置
4. 根据会话配置创建session,并指定delegate和delegate回调所在队列;实现相关协议方法
   1. 接收到响应
   2. 接收到data
   3. 任务完成
   4. 上传进度
5. 构建上传任务
6. 开启任务

 大文件

1. 构建URL
2. 构建请求  因为是上传需要在请求体中添加请求数据 使用NSMutableURLRequest
   1. 设置请求体方法
   2. 添加请求头`Content-Length`,告诉服务器上传的文件长度
   3. 设置请求体上传流
3. 创建会话配置
4. 根据会话配置创建`session`,并指定`delegate`和`delegate回调的队列`  实现相关协议方法
   1. 接收到响应
   2. 接收到data
   3. 任务完成
   4. 指定请求体输入流
   5. 上传进度
5. 构建上传任务
6. 开启任务

  下载文件

使用本地服务端:

将要下载的文件拖放到服务器工程中的web目录下,然后文件地址就是http://127.0.0.1/工程名/资源名称



使用网络地址:

http://www.flvurl.cn/Default.aspx

 普通文件

1. 构建URL
2. 构建请求  因为是下载,不需要在请求体中添加请求数据 使用NSURLRequest
3. 创建会话配置
4. 根据会话配置创建`session`,并指定`delegate`和`delegate回调的队列`  实现相关协议方法
   1. 下载进度
   2. 下载任务完成,因为此方法执行完毕后,系统会将下载文件删除,所以需要将文件移动或拷贝新位置
5. 构建下载任务
6. 开启任务

简单断点下载

1. 构建URL
2. 构建请求  因为是下载,不需要在请求体中添加请求数据 使用NSURLRequest
3. 创建会话配置
4. 根据会话配置创建`session`,并指定`delegate`和`delegate回调的队列`  实现相关协议方法
   1. 下载进度
   2. 下载任务完成,因为此方法执行完毕后,系统会将下载文件删除,所以需要将文件移动或拷贝新位置
   3. 断点下载的协议方法
5. 构建下载任务
6. 开启任务
   1. 根据URL下载
   2. 如果支持断点下载,开启任务时根据data启动任务
7. 断点下载取消任务时将数据保存起来

 真正的断点下载

### 使用NSURLSessionDataTask实现

1. 使用NSURLSessionDataTask完成基本的数据请求 并使用delegate形式获取回调
2. 返现mutableData不能满足下载文件时的需求  使用NSFileHandle
3. 在didReceiveData方法中,每接收一点数据,就写入磁盘
4. 一个已接收大小,总大小
   1. 在断点下载时给已接收大小赋值
   2. 在didReceiveResponse中  计算总大小
   3. 在didReceiveData更新已接收大小的值

### NSFileHandle

对比NSFileManager(文件管理器) NSFileHandle 文件处理器
NSFileManager(文件管理器) 操作整个文件或文件夹
NSFileHandle 文件处理器 操作文件内容

1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件
2.对打开的文件执行I/O操作(写入、读取) I/O就是 input/output
3.关闭文件
下面总结了一些常用的NSFileHandle的方法,在这个表中,fh是一个NSFileHandle对象,data是一个NSData对象,path是一个NSString 对象,offset是一个Unsigned long long变量,表示当前文件内容的位置
 ![1343466078_2895](./1343466078_2895.png)
应该注意到,NSFileHandle类并没有提供创建文件的功能。必须使用NSFileManager方法来创建文件。因此,方法 fileHandleForWritingAtPath:和fileHandleReadingAtPath:都假定文件已经存在,否则返回nil。 对于这两个方法,文件的偏移量都设为文件的开始,所以都是在文件的开始位置开始写入



Range头

    Range头域
      Range头域可以请求内容的一个或者多个子范围。例如,
      表示头500个字节:bytes=0-499
      表示第二个500字节:bytes=500-999
      表示最后500个字节:bytes=-500
      表示500字节以后的范围:bytes=500-
      第一个和最后一个字节:bytes=0-0,-1
      同时指定几个范围:bytes=500-600,602-999


 后台任务

1. 构建URL
2. 构建请求  因为是下载,不需要在请求体中添加请求数据 使用NSURLRequest
3. 创建会话配置
4. 根据会话配置创建`session`,并指定`delegate`和`delegate回调的队列`  实现相关协议方法
   1. 接收到响应
   2. 下载进度
   3. 下载任务完成,因为此方法执行完毕后,系统会将下载文件删除,所以需要将文件移动或拷贝新位置
5. 构建下载任务
6. 开启任务

程序进入后台

7. 如果下载完成,执行UIApplication的代理方法`handleEventsForBackgroundURLSession` 在方法中调用block表示有NSURLSession事件
8. 调用`URLSessionDidFinishEventsForBackgroundURLSession`

posted on 2016-12-24 20:41  调学者  阅读(154)  评论(0)    收藏  举报

导航