2015-05-12 4 views
5

Я использовал PickerController и загрузил несколько изображений на NSMutableArray.Загрузка нескольких изображений с использованием AFNetworking

Теперь мне нужно загрузить все эти изображения сразу. я использую AFNetworking и как я могу это сделать?

Я прошел через документацию AFNetworking и был раздел под названием Creating an Upload Task for a Multi-Part Request, with Progress. Тем не менее, я не могу загрузить изображения, которые находятся в моем NSMutableArray.

**** NB: Я хочу загрузить изображения в NSMutableArray в виде байт-массива. Как я могу это сделать? ****

код я до сих пор,

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURL *URL = [NSURL URLWithString:@"site.com/upload"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
+0

Вы можете заархивировать изображения и отправить их через Интернет? – Sandeep

+0

Многопользовательский запрос - отличный способ сделать это. Единственный трюк заключается в том, как получить «NSData» выбранных изображений. Лично я бы посоветовал «UIImagePNGRпредставление» или «UIImageJPEGRepresentation» и получить фактические байты исходного актива (см. Http://stackoverflow.com/a/27709329/1271826). Затем вы загружаете с помощью https://github.com/AFNetworking/AFNetworking#post-multi-part-request, за исключением 'appendPartWithFileData: name: fileName: mimeType: error:'. Ясно, что все это предполагает, что у вас есть веб-сервис, предназначенный для разбора многочастных запросов ... – Rob

+0

Должен ли я цикл '[formData appendPartWithFileData .....' несколько раз для загрузки нескольких файлов? – Illep

ответ

4
UIImage *image1 = [UIImage imageNamed:@"about_app"]; 
UIImage *image2 = [UIImage imageNamed:@"alter"]; 
NSArray *array = @[image1,image2]; 
NSMutableURLRequest *request = [[AFNetWorkSingleton shareInstance] multipartFormRequestWithMethod:@"POST" path:@"Mindex/getimg" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>formData){ 
int i = 0; 
for(UIImage *eachImage in array) 
{ 
    NSData *imageData = UIImageJPEGRepresentation(eachImage,0.5); 
    [formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"file%d",i ] fileName:[NSString stringWithFormat:@"file%d.jpg",i ] mimeType:@"image/jpeg"]; 
    i++; 
} 
}]; 

Попробуйте это.

0

Общая методика превращения UIImage в NSData является одним из следующих двух способов.

NSData *pngData = UIImagePNGRepresentation(myUIImage); 
CGFloat quality = 1.0; // ranges from 0 to 1, 0% to 100% 
NSData *jpgData = UIImageJPEGRepresentation(myUIImage, quality); 

Это, конечно, предполагает, что вы знаете, какой тип изображения у вас. Но так как вы использовали PickerController для получения изображений, то это должно быть довольно легко определить. Вы просто вытаскиваете значение под ключ UIImagePickerControllerReferenceURL и проверяете параметр ext. Этот комментарий показывает это визуально https://stackoverflow.com/a/11506499/1529638.

+0

Спасибо за ваш ответ. Но как я могу загрузить его с помощью AFNetworking? Я хочу отправить байт-массив. – Illep

+0

Какое тело вы должны отправить? Многоформатные данные формы? –

+0

Вы не отправляете «массив байтов», как таковой. Вы отправляете 'NSData'. См. Https://github.com/AFNetworking/AFNetworking#post-multi-part-request. – Rob

2
-(void)uploadImages{ 

// image.finalImage - is image itself 
// totalCount - Total number of images need to upload on server 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
NSDictionary *parameters = @{@"Key":@"Value",@"Key":@"Value"}; 
[manager POST:serverURL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileData:UIImagePNGRepresentation(image.finalImage) name:@"ImageName" fileName:[[Helper getRandomString:8] stringByAppendingString:@".png"] mimeType:@"image/png"]; 
} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:(NSData *)responseObject options:kNilOptions error:nil]; 
    _uploadCounter+=1; 
    if(_uploadCounter<totalCount){ 
     [self uploadImages]; 
    }else { 
     NSLog(@"Uploading all images done"); 
    } 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error"); 
}]; 

}

Попробуйте это, я загрузил 10 изображений на сервере, используя этот код и его успешно загружены на сервер.

+0

@Priya Я думаю, что ответ Харди достаточно хорош. вы можете проверить только определенные методы поиска в Obj-c. – Urmi

+0

, которые импортируют файл u для AFHTTPRequestOperationManager для этого. @Urmi –

+0

@HamzaImran Эй, я использовал AFNetworking Framework. поэтому, пожалуйста, проверьте эту структуру, вам нужно импортировать файл «Afnetworking.h». – Urmi

0

Если вы хотите загрузить несколько изображений, и вы хотите сохранить имя параметра одинаково для всех изображений, которые вы делаете это, как показано ниже:

NSDictionary *parameters = @{@"user_key": @"*****"}; 
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:queryStringss parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    NSError *error; 
    [formData appendPartWithFileData:imageData name:@"photo_file[0]" fileName:@"Picture44.png" mimeType:@"image/png"]; 
    [formData appendPartWithFileData:imageData1 name:@"photo_file[1]" fileName:@"Picture45.png" mimeType:@"image/png"]; 
} error:nil]; 

В этом случае файлы будут посланы как массив на сервер ,

1


Alamofire красивый источник/библиотека для того же:

Swift 4:

Alamofire.upload(
    multipartFormData: { multipartFormData in 
     multipartFormData.append(unicornImageURL, withName: "unicorn") 
     multipartFormData.append(rainbowImageURL, withName: "rainbow") 
    }, 
    to: "https://httpbin.org/post", 
    encodingCompletion: { encodingResult in 
     switch encodingResult { 
     case .success(let upload, _, _): 
      upload.responseJSON { response in 
       debugPrint(response) 
      } 
     case .failure(let encodingError): 
      print(encodingError) 
     } 
    } 
) 
Смежные вопросы