前言
做文件上传功能 有两种方式
一种是HTTP
方式,另一种Socket
方式
但是HTTP方式不能上传大文件
HTTP方式又有两种
一种是二进制流
上传 一种是multipart/form-data
形式
HTTP方式
二进制流
不能附加其他的参数multipart/form-data
形式可以附加其他参数
平常我们提交表单时 Request
的Content-Type
为如下所示
1 | Content-Type: application/x-www-form-urlencoded |
如果我们上传的表单中有文件 我们会设置表单enctype="multipart/form-data"
这时提交时Request
的Content-Type
为如下所示
1 | Content-Type: multipart/form-data; boundary=alamofire.boundary.9b2bf38bcb25c57e |
另一种文件上传Request
的Content-Type
为如下所示
1 | Content-Type: application/octet-stream |
用Alamofire进行HTTP上传
方式一 (multipart/form-data)
上传可以附带其他参数
但是这种方式没法得到上传进度
1 | //上传文件 |
方式二 (二进制流)
可以获取上传进度的方式 但是没法附带其他参数
1 | Alamofire.upload(.POST, "https://httpbin.org/post", file: imagePath) |
所以例如设置用户头像等就用第一种方式
要是做文件上传就必须用第二种方式 第二种方式也能控制暂停、继续、停止等操作
用AFNetworking进行HTTP上传
方式一
1 | static func uploadFile(url:String,parameters:[String:AnyObject]?,data:NSData,callBack:(success:Bool,operation:AFHTTPRequestOperation!,responseObject: AnyObject?,error:NSError?) -> Void ,progressBlock:(bytesWritten:UInt,totalBytesWritten:Int64,totalBytesExpectedToWrite:Int64) -> Void) -> AFHTTPRequestOperation { |
调用方式
1 | let operation = uploadFile("", parameters: nil, data: NSData(), callBack: { (success, operation, responseObject, error) in |
方式二
这种方式要使用KVO
来获取进度,个人不推荐
因为如果同时上传多个文件时进度处理起来会比较麻烦
Swift代码
1 | func uploadFile2(data:NSData){ |
ObjC代码
1 | NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { |
大文件上传
目前考虑到WEB端
只能用HTTP方式
,所以我用的是HTTP分片上传
方式一 HTTP形式
上面说了 大文件上传需要用Socket
其实用HTTP
的multipart/form-data
形式也可以
原理就是
上传时把文件进行切片
提交时除了文件data 同时传入 总片数 当前是第几片
服务端得到所有的数据片后合并数据
方式二 Socket形式
Socket
上传时 如果是大文件也是要进行分片的
上传下载客户端
上传
1 | - (void)viewDidLoad |
获取下载列表是通过互相发送消息,从服务端把文件对象(也就是文件在服务端的绝对路径)归档发送到客户端,然后在客户端反归档获取文件列表
1 | - (void)viewDidLoad |
下载是通过列表中的文件路径发送给服务端,然后服务端根据其路径找到文件返回去
1 | - (void)viewDidLoad |
上传下载服务端
1 | - (void)viewDidLoad |
把消息头存进要发送的数据中 并且固定占用多少字节
使用网络需要导入CFNetwork.framework框架