Created
April 13, 2018 02:46
-
-
Save juwencheng/f5bf8812b91ae20c442c5d2ce94bd951 to your computer and use it in GitHub Desktop.
POST multipart/form-data with Objective-C| 同时上传多张图片和参数的方式 Objective-C/Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- (NSData *)createBodyWithBoundary:(NSString *)boundary | |
parameters:(NSDictionary *)parameters | |
paths:(NSArray *)paths | |
fieldName:(NSString *)fieldName { | |
NSMutableData *httpBody = [NSMutableData data]; | |
// add params (all params are strings) | |
[parameters enumerateKeysAndObjectsUsingBlock:^(NSString *parameterKey, NSString *parameterValue, BOOL *stop) { | |
[httpBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; | |
[httpBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", parameterKey] dataUsingEncoding:NSUTF8StringEncoding]]; | |
[httpBody appendData:[[NSString stringWithFormat:@"%@\r\n", parameterValue] dataUsingEncoding:NSUTF8StringEncoding]]; | |
}]; | |
// add image data | |
for (NSString *path in paths) { | |
NSString *filename = [path lastPathComponent]; | |
NSData *data = [NSData dataWithContentsOfFile:path]; | |
NSString *mimetype = [self mimeTypeForPath:path]; | |
[httpBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; | |
[httpBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fieldName, filename] dataUsingEncoding:NSUTF8StringEncoding]]; | |
[httpBody appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", mimetype] dataUsingEncoding:NSUTF8StringEncoding]]; | |
[httpBody appendData:data]; | |
[httpBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; | |
} | |
[httpBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; | |
return httpBody; | |
} | |
@import MobileCoreServices; // only needed in iOS | |
- (NSString *)mimeTypeForPath:(NSString *)path { | |
// get a mime type for an extension using MobileCoreServices.framework | |
CFStringRef extension = (__bridge CFStringRef)[path pathExtension]; | |
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, extension, NULL); | |
assert(UTI != NULL); | |
NSString *mimetype = CFBridgingRelease(UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType)); | |
assert(mimetype != NULL); | |
CFRelease(UTI); | |
return mimetype; | |
} | |
- (NSString *)generateBoundaryString { | |
return [NSString stringWithFormat:@"Boundary-%@", [[NSUUID UUID] UUIDString]]; | |
} | |
- (void)postData { | |
// 需要上传的参数 | |
NSDictionary *params = @{@"userName" : @"rob", | |
@"userEmail" : @"[email protected]", | |
@"userPassword" : @"password"}; | |
// 需要上传的图片,可以是多张 | |
NSString *path = [[NSBundle mainBundle] pathForResource:@"avatar" ofType:@"png"]; | |
NSString *boundary = [self generateBoundaryString]; | |
// configure the request | |
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; | |
[request setHTTPMethod:@"POST"]; | |
// set content type | |
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; | |
[request setValue:contentType forHTTPHeaderField: @"Content-Type"]; | |
// create body | |
NSData *httpBody = [self createBodyWithBoundary:boundary parameters:params paths:@[path] fieldName:fieldName]; | |
// 使用 session 的方案 | |
NSURLSession *session = [NSURLSession sharedSession]; // use sharedSession or create your own | |
NSURLSessionTask *task = [session uploadTaskWithRequest:request fromData:httpBody completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { | |
if (error) { | |
NSLog(@"error = %@", error); | |
return; | |
} | |
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; | |
NSLog(@"result = %@", result); | |
}]; | |
[task resume]; | |
// 使用 DataTask 的方法 | |
request.HTTPBody = httpBody; | |
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { | |
if (error) { | |
NSLog(@"error = %@", error); | |
return; | |
} | |
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; | |
NSLog(@"result = %@", result); | |
}]; | |
[task resume]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment