2013-05-22 11 views
12

Sto aggiornando un vecchio codice dell'applicazione che utilizzava ASIHTTPRequest con AFNetworking. Nel mio caso, sto inviando un banco di dati a API, questi dati sono di diverso tipo: Immagine e altro.invia immagine insieme ad altri parametri con AFNetworking

ecco il codice adotto finora, l'implementazione di un client API, richiedendo un'istanza condivisa, preparare il dizionario params e inviarlo alla Remote API:

NSMutableDictionary *params = [NSMutableDictionary dictionary]; 
[params setValue:@"Some value" forKey:aKey]; 

[[APIClient sharedInstance] 
postPath:@"/post" 
parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //some logic 


} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //handle error 

}]; 

Quale sarebbe il caso quando voglio aggiungi un'immagine al dizionario params?

Con ASIHTTPRequest, ho usato per fare quanto segue:

NSData *imgData = UIImagePNGRepresentation(anImage); 

NSString *newStr = [anImageName stringByReplacingOccurrencesOfString:@"/" 
                   withString:@"_"]; 



[request addData:imgData 
    withFileName:[NSString stringWithFormat:@"%@.png",newStr] 
    andContentType:@"image/png" 
      forKey:anOtherKey]; 

ho scavato in AFNetworking documentazione e hanno trovato che aggiungendo l'immagine in un NSMutableRequest come questo:

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"avatar.jpg"], 0.5); 
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
    [formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg" mimeType:@"image/jpeg"]; 
}]; 

Come devo mescolare questo insieme in un modo pulito per integrare i miei dati di immagine nella richiesta APIClient? Grazie in anticipo.

risposta

20

Ho utilizzato lo stesso AFNetworking per caricare l'immagine con alcuni parametri. Questo codice funziona bene per me. Può essere d'aiuto

NSData *imageToUpload = UIImageJPEGRepresentation(uploadedImgView.image, 1.0);//(uploadedImgView.image); 
if (imageToUpload) 
{ 
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:keyParameter, @"keyName", nil]; 

    AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://------"]]; 

    NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"API name as you have" parameters:parameters constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
     [formData appendPartWithFileData: imageToUpload name:@"image" fileName:@"temp.jpeg" mimeType:@"image/jpeg"]; 
    }]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     NSDictionary *jsons = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil]; 
     //NSLog(@"response: %@",jsons); 

    } 
            failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     if([operation.response statusCode] == 403) 
     { 
      //NSLog(@"Upload Failed"); 
      return; 
     } 
     //NSLog(@"error: %@", [operation error]); 

    }]; 

    [operation start]; 
} 

Buona fortuna !!

+0

Ciao, dove si fa a mettere la 'key' per l'immagine? Grazie. – Malloc

+2

@ "immagine" è la chiave per qualsiasi immagine che si desidera caricare. –

+0

Ti aiuta? –

9

Con AFNetworking 2.0.1 questo codice ha funzionato per me.

-(void) saveImage: (NSData *)imageData forImageName: (NSString *) imageName { 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    NSString *imagePostUrl = [NSString stringWithFormat:@"%@/v1/image", BASE_URL]; 
    NSDictionary *parameters = @{@"imageName": imageName}; 

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:imagePostUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFileData:imageData name:@"image" fileName:imageName mimeType:@"image/jpeg"]; 
    }]; 

    AFHTTPRequestOperation *op = [manager HTTPRequestOperationWithRequest:request success: ^(AFHTTPRequestOperation *operation, id responseObject) { 
     DLog(@"response: %@", responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     DLog(@"Error: %@", error); 
    }]; 
    op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
    [[NSOperationQueue mainQueue] addOperation:op]; 
} 

Se è necessaria una risposta JSON uso:

op.responseSerializer = [AFJSONResponseSerializer serializer]; 

invece di

op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
+2

AFHTTPClient è suddiviso in [AFHTTPRequestOperationManager & AFHTTPSessionManager] (https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide#afhttpclient--afhttprequestoperationmanager--afhttpsessionmanager). Non esiste più in 2.0. – jerik

+0

grazie mille! – Frade

Problemi correlati