Upload multiple files using http POST

时光怂恿深爱的人放手 提交于 2019-12-04 06:09:01

Have you looked at using ASIHTTPRequest's ASINetworkQueue to send multiple files.

UPDATE: As per comment below, ASIHTTPRequest is no longer maintained. Use caution with this framework. Other options are MKNetworkKit or AFNetworking.

It is rather simple. Just form multipart body. Suppose you have files to upload and regular params in the 'params' dictionary:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: urlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:54.0];

NSMutableData* body = [NSMutableData data];

NSString* boundary = [NSString randomStringWithLength:64];
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];
NSData *boundaryData = [[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding];

[params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
   [body appendData:boundaryData];
    // I use special simple class to distinguish file params
   if( [obj isKindOfClass:[FileUpload class]] ) {
        // File upload
        [body appendData: [[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n\r\n", key, [obj localName]] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData: [obj loadData]]; // It just return NSData with loaded file in it
        [body appendData: [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    }
    else {
        // Regular param
        [body appendData: [[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n", key, obj] dataUsingEncoding:NSUTF8StringEncoding]]
    }
}];
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:body];

Now you can just dispatch it in any way:

[NSURLConnection sendAsynchronousRequest:request
                                   queue:queueOfYourChoice
                       completionHandler:^(NSURLResponse *response, NSData *rdata, NSError *error) 

FileUpload class is fairly trivial: it constructs from an url/filename, provides this name as a method and loads the binary content into NSData*. I don't list it for clarity, but if need, I'll add.

Avik

you may have a problem in setting boundary.

Use this as boundary

NSString boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];

and use this

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

instead of this

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!