直接上代码
// 1. 文件上传傻瓜版
- (void)upload {
// 1.上传给服务器的路径
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"请求路径"]];
// 2. 创建一个POST请求
request.HTTPMethod = @"POST";
// 如果请求体不一样了(JSON或者文件等),得通过请求头告诉服务器 ,内容的类型 MIMEType 比如 txt png 等等
// 设置请求头 告诉服务器这次传给你的是 什么类型
// ------------------149394928198239
// content-disposition:form-data;name=@"参数名";filename=@"文件名";
// content—type:文件类型(MIMEType)
//
// 文件具体数据
// ----开始拼接
// 3.设置请求体
NSMutableData *body = [NSMutableData data];
// 3.1 文件参数
// boundary
[body appendData:Encode(@"--")];
[body appendData:Encode(FileBoundary)]; // 拼接分隔符
[body appendData:Encode(NewLine)]; // 换行,严格来说是 \r\n
// \ 转义 disposition
[body appendData:Encode(@"Content-Disposition: form-data; name=@\"参数名\"; filename=@\"文件名\"")];
[body appendData:Encode(NewLine)];
[body appendData:Encode(@"Content—Type: image/png")];
[body appendData:Encode(NewLine)];
// 这是要上传的数据
[body appendData:Encode(NewLine)];
UIImage *image = [UIImage imageNamed:@"图片名字"];
// UIImage - > NSData
NSData *imageData = UIImagePNGRepresentation(image);
[body appendData:imageData];
[body appendData:Encode(NewLine)];
// ------------------charles
// content-disposition:form-data;name=@"参数名"
//
// 参数值
// 3.2 非文件参数
[body appendData:Encode(@"--")];
[body appendData:Encode(FileBoundary)];
[body appendData:Encode(NewLine)];
// \ 转义
[body appendData:Encode(@"Content-Disposition: form-data; name=@\"参数名\"")];
[body appendData:Encode(NewLine)];
// 这是要上传的数据
[body appendData:Encode(NewLine)];
[body appendData:Encode(@"张三")];
[body appendData:Encode(NewLine)];
// 3.3
[body appendData:Encode(@"--")];
[body appendData:Encode(FileBoundary)];
[body appendData:Encode(@"--")];
[body appendData:Encode(NewLine)];
request.HTTPBody = body;
// 4. 设置请求头
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n",FileBoundary];
// 设置请求头类型和长度
[request setValue:contentType forKey:@"Content-Type"];
NSString *value = [NSString stringWithFormat:@"%lu",body.length];
[request setValue:value forKey:@"Content-Length"];
// 5. 发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (data == nil || connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"%@",dict);
} else { // 文件上传成功
NSLog(@"%@",connectionError);
}
}];
}
// 2. 文件上传加强版,(封装版)
- (void)viewDidLoad {
[super viewDidLoad];
// 情况 1个文件 多个非文件参数
NSDictionary *params = @{
@"username" : @"李四",
@"password" : @"123"
};
// 文件开始上传
// 文件名字随便起 只是告诉服务器它需要生成什么名字
UIImage *image = [UIImage imageNamed:@"图片名字"];
[self upload:@"文件名字" mimeType:@"image/png" fileData:UIImagePNGRepresentation(image) params:params];
}
// 上传给我文件名和参数等。。
// 文件数据: fileName 和 mimeType 其他数据 字典
// 给我文件名 文件类型 文件数据 我给你上传~~~~
- (void)upload:(NSString *)fileName
mimeType:(NSString *)mimeType
fileData:(NSData *)fileData
params:(NSDictionary *)params {
// 1.上传给服务器的路径
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"请求路径"]];
// 2. 创建一个POST请求
request.HTTPMethod = @"POST";
// 如果请求体不一样了,得通过请求头告诉服务 ,内容的类型
// 设置请求头 告诉服务器这次传给你的是神马类型~~
// 这次是一个文件数据~~~
// ------------------149394928198239
// content-disposition:form-data;name=@"参数名";filename=@"文件名";
// content—type:文件类型(MIMEType)
//
// 文件具体数据
// ----开始拼接
// 3.设置请求体
NSMutableData *body = [NSMutableData data];
// 3.1 文件参数
// boundary
[body appendData:Encode(@"--")];
[body appendData:Encode(FileBoundary)];
[body appendData:Encode(NewLine)];
// \ 转义
NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=@\"参数名\"; filename=@\"%@\"",fileName];
[body appendData:Encode(disposition)];
[body appendData:Encode(NewLine)];
NSString *type = [NSString stringWithFormat:@"Content—Type: %@",mimeType];
[body appendData:Encode(type)];
[body appendData:Encode(NewLine)];
[body appendData:Encode(NewLine)];
[body appendData:fileData];
[body appendData:Encode(NewLine)];
// ------------------charles
// content-disposition:form-data;name=@"参数名"
//
// 参数值
// 3.2 非文件参数
// 遍历 字典中的参数 追加到请求体中
[params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[body appendData:Encode(@"--")]; // 比ContentType多@"--"
[body appendData:Encode(FileBoundary)];
[body appendData:Encode(NewLine)];
// \ 转义
NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=@\"%@\"",key];
[body appendData:Encode(disposition)];
[body appendData:Encode(NewLine)];
[body appendData:Encode(NewLine)];
// id -> NSString 转化为字符串description
[body appendData:Encode([obj description])];
[body appendData:Encode(NewLine)];
}];
// 3.3 结束标记
[body appendData:Encode(@"--")];
[body appendData:Encode(FileBoundary)];
[body appendData:Encode(@"--")];
[body appendData:Encode(NewLine)];
request.HTTPBody = body;
// 4. 设置请求头
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n",FileBoundary];
// 类型和长度
[request setValue:contentType forKey:@"Content-Type"];
NSString *value = [NSString stringWithFormat:@"%lu",body.length];
[request setValue:value forKey:@"Content-Length"];
// 5. 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"%@",dict);
}];
}