Skip to content

Instantly share code, notes, and snippets.

@juwencheng
Created April 13, 2018 02:46
Show Gist options
  • Save juwencheng/f5bf8812b91ae20c442c5d2ce94bd951 to your computer and use it in GitHub Desktop.
Save juwencheng/f5bf8812b91ae20c442c5d2ce94bd951 to your computer and use it in GitHub Desktop.

Revisions

  1. @OwenJu OwenJu created this gist Apr 13, 2018.
    105 changes: 105 additions & 0 deletions post_form_data.m
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,105 @@
    - (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];
    }