2013-05-22 10 views
12

Ich aktualisiere einen alten Anwendungscode, der ASIHTTPRequest mit AFNetworking verwendet. In meinem Fall sende ich eine Datenbank an API, diese Daten sind verschiedene Arten: Bild und andere.senden Bild zusammen mit anderen Parametern mit AFNetworking

Hier ist der Code, den ich bisher übernehmen, eine API-Client-Implementierung, eine gemeinsame Instanz anfordert, das params Wörterbuch erstellen und an Remote-API senden:

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 

}]; 

Was wäre der Fall sein, wenn ich will ein Bild zum params Wörterbuch hinzufügen?

Mit ASIHTTPRequest, habe ich folgendes zu tun:

NSData *imgData = UIImagePNGRepresentation(anImage); 

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



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

I digged in AFNetworking Dokumentation und fanden sie in einem NSMutableRequest wie dies das Bild angehängt:

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

Wie soll ich diese mischen zusammen auf eine nette Weise, meine Bilddaten in die APIClient Anfrage zu integrieren? Danke im Voraus.

Antwort

20

Ich habe das gleiche AFNetworking verwendet, um ein Bild mit einem Parameter hochzuladen. Dieser Code funktioniert gut für mich. Es kann helfen

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

Viel Glück !!

+0

Hallo, wo setzen Sie die 'key' für das Bild? Danke. – Malloc

+2

@ "Bild" ist der Schlüssel für jedes Bild, das Sie hochladen möchten. –

+0

Hilft es Ihnen? –

9

Mit AFNetworking 2.0.1 funktionierte dieser Code für mich.

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

Wenn JSON Antwort Verwendung benötigt wird:

op.responseSerializer = [AFJSONResponseSerializer serializer]; 

statt

op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
+2

AFHTTPClient ist in [AFHTTPRequestOperationManager & AFHTTPSessionManager] (https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide#afhttpclient--afhttprequestoperationmanager--afhttpssessionmanager) unterteilt. Es existiert nicht mehr in 2.0. – jerik

+0

vielen dank! – Frade

Verwandte Themen