您的位置:首页 > 其它

[置顶] 使用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。
如果是上传大文件,怎要分块上传。每一块都是这个原理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐