2013-05-22 5 views
12

ASIHTTPRequestを使用していた古いアプリケーションコードをAFNetworkingに更新しています。私の場合、私はAPIにデータのベンチを送っています、これらのデータは異なるタイプです:画像とその他。ここでAFNetworkingで他のパラメータとともに画像を送信

は私が共有インスタンスを要求、APIクライアントを実装し、これまでの採用、のparams辞書を用意し、リモート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 

}]; 

私がしたい時にケースになりますどのようなparams辞書に画像を追加しますか? ASIHTTPRequest

、私は次の操作を実行するために使用:

NSData *imgData = UIImagePNGRepresentation(anImage); 

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



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

私はAFNetworkingドキュメントに掘っ、彼らはこのようなNSMutableRequestに画像を追加した:

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

どのように私はこれを混ぜる必要があります私のイメージデータをAPIClientリクエストに統合するためのすっきりした方法で一緒に?あらかじめThanx。

答えて

20

同じAFNetworkingを使用して、いくつかのパラメータで画像をアップロードしました。このコードは私にとってうまく動作します。それが助けになるかもしれない

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

Good Luck !!

+0

こんにちは、の? 〜 – Malloc

+2

@ "画像"は、アップロードしたい画像のキーです。 –

+0

それはあなたに役立つのですか? –

9

AFNetworking 2.0.1では、このコードが役に立ちました。

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

JSON応答が必要な利用の場合:

op.responseSerializer = [AFJSONResponseSerializer serializer]; 

代わりにあなたがイメージのために `key`を置けばいい

op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
+2

AFHTTPClientは[AFHTTPRequestOperationManager&AFHTTPSessionManager](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide#afhttpclient--afhttprequestoperationmanager--afhttpsessionmanager)に分割されています。これは2.0ではもう存在しません。 – jerik

+0

ありがとう! – Frade

関連する問題