[置顶] 使用NSURLSession简单做一个上传图片的方法
2017-04-27 15:45
483 查看
通常上传文件、图片。使用http请求的POST方法,在body体中还有一些固定的格式。iOS SDK中的NSURLSession是一个heigh-level API,由于上传图片是一次性请求,实现起来还是很方便的:下面是关键代码,一个函数即可可以实现:
#define UploadImageBoundary @"KhTmLbOuNdArY0001"
- (NSURLRequest *)POSTImage:(NSString *)URLString data:(NSData *)imageData name:(NSString*)name finish:(RequestFinish)finish{
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]];
[request setHTTPMethod:@"POST"];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setTimeoutInterval:20];
NSString* headerString = [NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@",UploadImageBoundary];
[request setValue:headerString forHTTPHeaderField:@"Content-Type"];
NSMutableData* requestMutableData = [NSMutableData data];
NSMutableString* myString = [NSMutableString stringWithFormat:@"--%@\r\n",UploadImageBoundary];
[myString appendString:@"Content-Disposition: form-data; name=\"appid\"\r\n\r\n"];/*这里要打两个回车*/
[myString appendString:@"100118"];
[myString appendString:[NSString stringWithFormat:@"\r\n--%@\r\n",UploadImageBoundary]];
[myString appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n",name]];
[myString appendString:@"Content-Type: image/jpeg\r\n\r\n"];
/*转化为二进制数据*/
[requestMutableData appendData:[myString dataUsingEncoding:NSUTF8StringEncoding]];
/*文件数据部分,也是二进制*/
[requestMutableData appendData:imageData];
/*已--boundary结尾表明结束*/
[requestMutableData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",UploadImageBoundary] dataUsingEncoding:NSUTF8StringEncoding] ];
request.HTTPBody = requestMutableData;
/*开始上传*/
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 20;
NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
NSURLSessionDataTask * uploadtask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
if (finish) {
finish(nil,dictionary,error);
}
}];
[uploadtask resume];
return request;
}调用方法如下:
-(void) uploadCover:(UIImage*)image{
NSData * imagedata = UIImageJPEGRepresentation(image,1.0);
[[Networking sharedInstance] POSTImage:@"http:/xxxxx/ndfs/uploadPhoto.do" data:imagedata name:self.videoName finish:^( id responseObject, NSError *error) {
DDLogWarn(@"uploadCover: %@",responseObject);
}];
}
上面是抓包结果。第9行开始就是图片的data内容了。其中--KhTmLbOuNdArY0001是分割数据用的,需要以“--”开头,后面随意
曾经应为少了一个回车(代码中有注释)导致server应答400,说Retrofit - Multipart request: Required MultipartFile parameter 'file' is not present。
如果是上传大文件,怎要分块上传。每一块都是这个原理。
#define UploadImageBoundary @"KhTmLbOuNdArY0001"
- (NSURLRequest *)POSTImage:(NSString *)URLString data:(NSData *)imageData name:(NSString*)name finish:(RequestFinish)finish{
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]];
[request setHTTPMethod:@"POST"];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setTimeoutInterval:20];
NSString* headerString = [NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@",UploadImageBoundary];
[request setValue:headerString forHTTPHeaderField:@"Content-Type"];
NSMutableData* requestMutableData = [NSMutableData data];
NSMutableString* myString = [NSMutableString stringWithFormat:@"--%@\r\n",UploadImageBoundary];
[myString appendString:@"Content-Disposition: form-data; name=\"appid\"\r\n\r\n"];/*这里要打两个回车*/
[myString appendString:@"100118"];
[myString appendString:[NSString stringWithFormat:@"\r\n--%@\r\n",UploadImageBoundary]];
[myString appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n",name]];
[myString appendString:@"Content-Type: image/jpeg\r\n\r\n"];
/*转化为二进制数据*/
[requestMutableData appendData:[myString dataUsingEncoding:NSUTF8StringEncoding]];
/*文件数据部分,也是二进制*/
[requestMutableData appendData:imageData];
/*已--boundary结尾表明结束*/
[requestMutableData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",UploadImageBoundary] dataUsingEncoding:NSUTF8StringEncoding] ];
request.HTTPBody = requestMutableData;
/*开始上传*/
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 20;
NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
NSURLSessionDataTask * uploadtask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
if (finish) {
finish(nil,dictionary,error);
}
}];
[uploadtask resume];
return request;
}调用方法如下:
-(void) uploadCover:(UIImage*)image{
NSData * imagedata = UIImageJPEGRepresentation(image,1.0);
[[Networking sharedInstance] POSTImage:@"http:/xxxxx/ndfs/uploadPhoto.do" data:imagedata name:self.videoName finish:^( id responseObject, NSError *error) {
DDLogWarn(@"uploadCover: %@",responseObject);
}];
}
上面是抓包结果。第9行开始就是图片的data内容了。其中--KhTmLbOuNdArY0001是分割数据用的,需要以“--”开头,后面随意
曾经应为少了一个回车(代码中有注释)导致server应答400,说Retrofit - Multipart request: Required MultipartFile parameter 'file' is not present。
如果是上传大文件,怎要分块上传。每一块都是这个原理。
相关文章推荐
- C# 一个图片上传的简单方法
- C# 一个图片上传的简单方法
- 使用PHP破解防盗链图片的一个简单方法
- 使用PHP破解防盗链图片的一个简单方法
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- Uploadify在MVC中使用方法案例(一个视图多次上传单张图片)
- 上传图片的简单方法
- 一个简单实用的ASP调试函数和使用方法
- 上传图片并生成缩略图的一个方法
- ASP.NET上传图片的简单方法
- web.config文件自定义配置节的使用方法的一个简单例子
- ASP.NET上传图片的简单方法
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 一个简单的利用POST方法上传文件
- 关于sql server 存储图片的一个简单方法
- 如何用最简单最快的方法判断一个BMP图片是否为黑白图片?我现在是全图片scanline 然后再加以分析,太慢了,有没有直接的函数可以做到呢?
- 一个上传图片很有用的方法...
- 上传图片并显示缩略图的最简单方法(c#)
- 一个简单的方法:找出哪个的程序使用了哪个端口
- 一个自己写的真正判断文件格式,文件大小,而并不仅仅从扩展名来进行判断的上传方法,进一步加强防止软件或恶意的木马图片上传