2013-05-22 10 views
12

Aktualizuję stary kod aplikacji, który używał ASIHTTPRequest z AFNetworking. W moim przypadku wysyłam zestaw danych do API, dane te są różne: obraz i inne.Wyślij obraz wraz z innymi parametrami za pomocą AFNetworking

Oto kod I przyjąć tak daleko, wdrożenie klienta API, prosząc udostępnionego instancji przygotować słownika params i wysłać je do zdalnego 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 

}]; 

Jaki byłby przypadek, kiedy chcę dodać zdjęcie do słownika params?

Z ASIHTTPRequest, kiedyś wykonać następujące czynności:

NSData *imgData = UIImagePNGRepresentation(anImage); 

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



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

I wykopali w AFNetworking dokumentacji i okazało się, że dodanie obrazu w NSMutableRequest jak ten:

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

Jak należy mieszać tego razem w zgrabny sposób, aby zintegrować moje dane obrazu z żądaniem APIClient? Z góry z góry.

Odpowiedz

20

Użyłem tego samego AFNetworking, aby przesłać obraz z pewnym parametrem. Ten kod działa dobrze dla mnie. Może być pomocna

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

Powodzenia !!

+0

Hi, gdzie można umieścić 'key' dla obrazu? Thanx. – Malloc

+2

@ "image" jest kluczem do każdego obrazu, który chcesz załadować. –

+0

Czy to pomaga? –

9

Kod AFNetworking 2.0.1 działał dla mnie.

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

Jeśli odpowiedź JSON jest potrzebne zastosowanie:

op.responseSerializer = [AFJSONResponseSerializer serializer]; 

zamiast

op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
+2

AFHTTPClient jest podzielony na [AFHTTPRequestOperationManager i AFHTTPSessionManager] (https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Gide-#afhttpclient-afhttprequestoperationmanager-afhttpsessionmanager). Już nie istnieje w wersji 2.0. – jerik

+0

wielkie dzięki! – Frade

Powiązane problemy