一、介绍
用POST上传NSString或者图片都比较简单,但是一起上传的时候就有点难度,这里说一下图片和字符串怎么一起POST
二、实现
附上代码&解释
//一共传递3个变量,其中nickname和sex是NSString的对象而photoFile是UIImage
//设置好url后初始化request,接下来需要做的有这几件事情:1.设置multipart&boundary,2.nickname、sex&photoFile加入到NSMutableData类型的body变量中,其中每个变量之间要设置分界线,3.将设置好的body作为request的HTTPbody,然后用NSURLSessionDataTask来发送即可
//注意:1、[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];这里的
//2、\r\n用于换行
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSString *boundary = @"----WebKitFormBoundary7MA4YWxkTrZu0gW";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
//nickname
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n",@"nickname"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[self.writeName.text stringByAppendingString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
//sex
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",@"sex"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"1\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//photo file
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"headPhoto.jpg\"\r\n", @"photoFile"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//set http body
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:body];
三、微小的工作
上传图片的时候应该保证图片不超过指定大小,这里在将UIImage转成NSData的时候,用到了UIImageJPEGRepresentation函数的压缩系数,用loop的方法保证NSData的大小,附上压缩函数代码
- (NSData *)compressImage:(UIImage *)image {
CGFloat compression = 0.9f;
CGFloat maxCompression = 0.1f;
int maxFileSize = 2048000;
NSData *imageData = UIImageJPEGRepresentation(self.chooseHeadPhoto.imageView.image, compression);
while ([imageData length] > maxFileSize && compression > maxCompression)
{
compression -= 0.1;
imageData = UIImageJPEGRepresentation(self.chooseHeadPhoto.imageView.image, compression);
}
return imageData;
}