Это довольно просто. Просто сформируйте составное тело. Предположим, у вас есть файлы для загрузки и обычные параметры в словаре параметров:
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];
Теперь вы можете отправить его любым способом:
[NSURLConnection sendAsynchronousRequest:request
queue:queueOfYourChoice
completionHandler:^(NSURLResponse *response, NSData *rdata, NSError *error)
Класс FileUpload довольно тривиален: он создается из URL / имени файла, предоставляет это имя как метод и загружает двоичный контент в NSData *. Я не перечисляю это для ясности, но если нужно, я добавлю.