2015-05-12 7 views
5

Ho utilizzato PickerController e caricato alcune immagini su un NSMutableArray.Caricamento di più immagini tramite AFNetworking

Ora ho bisogno di caricare tutte queste immagini contemporaneamente. sto usando AFNetworking e come posso fare questo?

Ho esaminato la documentazione AFNetworking e c'era una sezione chiamata Creating an Upload Task for a Multi-Part Request, with Progress. Tuttavia, non sono in grado di caricare le immagini presenti nel mio NSMutableArray.

**** NB: voglio caricare le immagini nello NSMutableArray come array di byte. Come posso fare questo? ****

Il codice che ho finora,

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

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

può comprimere le immagini e inviarle via internet? – Sandeep

+0

La richiesta multipart è un ottimo modo per farlo. L'unico trucco è come ottenere il 'NSData' delle immagini selezionate. Personalmente, sconsiglio di dire "UIImagePNGRepresentation' o" UIImageJPEGRepresentation' e ottenere i byte effettivi della risorsa originale (vedi http://stackoverflow.com/a/27709329/1271826). Quindi si carica utilizzando https://github.com/AFNetworking/AFNetworking#post-multi-part-request tranne con 'appendPartWithFileData: name: fileName: mimeType: error:'. Chiaramente, tutto questo presuppone che tu abbia un servizio web progettato per analizzare le richieste multipart ... – Rob

+0

Dovrei eseguire un ciclo '[formData appendPartWithFileData .....' più volte per caricare più file? – Illep

risposta

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++; 
} 
}]; 

Prova questo.

0

tecnica comune per trasformare un UIImage in NSData è con uno dei due metodi seguenti.

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

Questo ovviamente presuppone che tu sappia quale tipo è l'immagine. Ma dal momento che hai usato un PickerController per recuperare le immagini, allora dovrebbe essere abbastanza facile determinarlo. Basta estrarre il valore sotto la chiave UIImagePickerControllerReferenceURL e verificare il parametro ext. Questo commento lo mostra visivamente https://stackoverflow.com/a/11506499/1529638.

+0

Grazie per la risposta. Ma come posso caricarlo usando AFNetworking? Voglio inviare un array di byte. – Illep

+0

Che tipo di corpo si suppone di inviare? Dati di moduli multiparte? –

+0

Non si invia "array di byte", di per sé. Si invia 'NSData'. Vedere 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"); 
}]; 

}

Prova questo, ho caricato 10 immagini su server utilizzando questo codice e la sua caricato con successo sul sever.

+0

@Priya penso che la risposta di Hardik sia abbastanza buona. puoi controllare i metodi specifici di ricerca solo in Obj-c. – Urmi

+0

quale file di importazione si usa per AFHTTPRequestOperationManager per questo. @ Umi –

+0

@HamzaImran Ehi, ho usato AFNetworking Framework. quindi per favore controlla questo framework devi importare il file "Afnetworking.h". – Urmi

0

Se si desidera caricare più immagini e si desidera mantenere il nome del parametro stesso per tutte le immagini che si fanno come qui sotto:

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]; 

In questo modo i file verranno inviati come matrice per il server .

1


Alamofire è bello sorgente/libreria per la stessa:

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) 
     } 
    } 
)