2013-11-21 3 views
1

Я хочу отправить свое изображение с параметром (имя пользователя, пароль..etc) ?? Ниже мой код:Отправить параметр с изображением методом POST?

-(void) senRequestForPostAnswerWithImage:(NSString *)imageName andAnswer:(NSString *)answer andQuestionID:(NSString *)questionID 
{ 
    NSUserDefaults *loginData = [NSUserDefaults standardUserDefaults]; 
    NSString *username = [loginData objectForKey:@"username"] ; 
    NSString *password = [loginData objectForKey:@"password"]; 

    NSString *postString = [NSString stringWithFormat:@"&username=%@&password=%@&image=%@&answer=%@&question_id=%@", username, password, imageName, answer, questionID]; 
    NSString *urlString = @"http://myAPIName/MethodName"; 
    NSURL *myURL = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSMutableURLRequest *detailRequestToServer =[NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; 
    [detailRequestToServer setHTTPMethod:@"POST"]; 
    [detailRequestToServer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    const char *utfString = [postString UTF8String]; 
    NSString *utfStringLenString = [NSString stringWithFormat:@"%zu", strlen(utfString)]; 
    [detailRequestToServer setHTTPBody:[NSData dataWithBytes: utfString length:strlen(utfString)]]; 
    [detailRequestToServer setValue:utfStringLenString forHTTPHeaderField:@"Content-Length"]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:detailRequestToServer delegate:self]; 
    if (theConnection) 
    { 
     self.responseData = [[NSMutableData alloc] init]; 
     [GeneralClass startHUDWithLabel:@"Loading…"]; 
    } 
    else 
     NSLog(@"Connection Failed!"); 
} 

Я знаю, что есть много вопросов на этом сайте, но я не знаю, где и что нужно изменить в моем существующем коде ??

Итак, пожалуйста, предложите мне, что мне нужно изменить в моем существующем коде для добавления функциональности отправки изображения?

ПРИМЕЧАНИЕ: без изображения этот выше код работает хорошо для меня.

+0

См. Ссылку ниже, которая намного лучше. http://stackoverflow.com/a/8567771/4524276 –

ответ

-1

Смотрите этот код - Он отлично работает для меня -

NSString *userID = mainDelegate.loginUserPin; 

UIImage *imag = self.addImage; 

NSString *urlString = mainDelegate.I2K2_Webservice_Url; 

NSData *imageData = UIImageJPEGRepresentation(imag, 90); 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 
[request setTimeoutInterval:6*60000]; 

NSString *boundary = @"*****"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

//Title 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"title\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"%@~%@",userID,txtName.text] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

//Description 
[body appendData:[@"Content-Disposition: form-data; name=\"description\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

NSString *imgNameString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"%@~%@\"\r\n",userID,txtName.text]; 

NSLog(@"imgNameString : %@",imgNameString); 

[body appendData:[[NSString stringWithString:imgNameString] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:imageData]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:body];    

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

NSLog(@"%@",returnString); 
+0

@Abizern: Что значит ваш комментарий? Удаленный текст? – Smita

+0

http://www.codinghorror.com/blog/2004/12/happy-talk-must-die.html – Abizern

1

Насколько я знаю, вы не можете напрямую отправить его как UIImage. Вам нужно преобразовать его в NSData, который будет декодироваться на стороне сервера.

Другой вариант - загрузить изображение где-нибудь, к которому можно получить доступ через URL-адрес. (Но это обычно делается на стороне сервера, и URL-адрес возвращается в качестве ответа).

There's a post here о преобразовании UIImage в NSData.

-1

Вы не можете отправить UIImage, указав его имя веб-серверу. Вы должны включить его в тело HTTP как NSData. Я использовал ASIHTTPRequest, это было просто и идеально. Используйте ASIHTTPRequest. Примерный код приведен ниже

NSData *imgData = UIImageJPEGRepresentation(IMAGE_HERE, 0.9); 
formReq = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:urlString]]; 
formReq.delegate = self; 
[formReq setPostValue:VALUE1 forKey:KEY1]; 
[formReq setPostValue:VALUE2 forKey:KEY2]; 
if (imgData) { 
    [formReq setData:imgData withFileName:@"SAMPLE.jpg" andContentType:@"image/jpeg" forKey:IMAGE_KEY]; 
} 
[formReq startSynchronous]; 
+1

ASIHTTP в значительной степени мертв, теперь см. Эту ссылку: http://stackoverflow.com/questions/8636418/asihttprequest -vs-afnetworking-framework – Ajay

2

Мое предложение было бы использовать AFNetworking. Это значительно упростит процесс для вас и сэкономит вам много времени. Он широко используется инфраструктурой разработчиков.

https://github.com/AFNetworking/AFNetworking

Вы можете легко отправить изображение с параметрами, используя всего несколько строк (POST-многочастному запрос):

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar"}; 
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; 
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileURL:filePath name:@"image" error:nil]; 
} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Success: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
0

Если вы хотите отправить параметр с изображением методом пост используйте следующий код. Его работа очень хорошо для меня ..

Я попытался изменить свой код согласно вашему требованию, следуйте его.
Вам необходимо создать NSMutableDictionary и добавить свой параметр на него, а также добавить этот словарь к NSMutableData в качестве JSON formate. (Вы должны добавить NSMutableData библиотеки в ваш проект)

-(void) senRequestForPostAnswerWithImage:(NSString *)imageName andAnswer:(NSString *)answer andQuestionID:(NSString *)questionID 
{ 
    NSUserDefaults *loginData = [NSUserDefaults standardUserDefaults]; 
    NSString *username = [loginData objectForKey:@"username"] ; 
    NSString *password = [loginData objectForKey:@"password"]; 

    // create NSMutableDictionary for store parameter 
    NSMutableDictionary *dicOfData = [[NSMutableDictionary alloc] init]; 
    [dicOfData setObject:username forKey:@"username"]; 
    [dicOfData setObject:password forKey:@"password"]; 
    [dicOfData setObject:imageName forKey:@"imageName"]; 
    [dicOfData setObject:answer forKey:@"answer"]; 
    [dicOfData setObject:questionID forKey:@"questionID"]; 

    NSString *url = @"http://myAPIName/MethodName"; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; 
    [request setHTTPMethod:@"POST"]; 

    /// create NSMutableData to store data of dictionary 
    NSMutableData *body = [NSMutableData data];  
    NSString *boundary = @"--iOS Boundary Line--"; 
    [request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField: @"Content-Type"]; 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    NSString *imgPath = [documentsDir stringByAppendingPathComponent:imageName]; 
    if([imageName length] > 0) 
    { 
     if([[NSFileManager defaultManager] fileExistsAtPath:imgPath]) 
     { 
      [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

      [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo\"; filename=\"%@\"\r\n", imageName] dataUsingEncoding:NSUTF8StringEncoding]]; 
      [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
      [body appendData:[NSData dataWithContentsOfFile:imgPath]]; 
      [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     } 
    } 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"requestData\"\r\n\r\n%@", [dicOfData JSONRepresentation] ] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [request setHTTPBody:body]; 
    [request addValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (theConnection) 
    { 
     self.responseData = [[NSMutableData alloc] init]; 
    } 
    else 
     NSLog(@"Connection Failed!"); 
} 

На вашем сервере (PHP) стороны .. вы получаете изображение (объект и имя, если вы добавили) с другими параметр в словаре formate.

+0

Не существует метода [dicOfData JSONRepresentation]. Он показывает ошибку в моем коде. – iHulk

1

с помощью этого вы можете передавать параметры, а также с данными изображения.

NSString *urlString = [NSString stringWithFormat:@"http://myAPIName/MethodName/test.php&username=%@&password=%@&image=%@&answer=%@&question_id=%@", username, password, imageName, answer, questionID]; 
NSLog(@"MyURL: %@",urlString); 

urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:urlString]]; 

[request setHTTPMethod:@"POST"]; 
NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

NSString *str=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"SourceImage\"; filename=\"Image_%@\"\r\n",[imagePath lastPathComponent]]; 
[body appendData:[[NSString stringWithString:str] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithContentsOfFile:imagePath]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

[request setHTTPBody:body]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
+0

@Bhargavi сейчас у меня проблема, и ваш код работает отлично, но он не загружает изображение, когда сервер защищен. вы пробовали этот код, когда безопасность включала сервер? –

+0

@Bhargavi пожалуйста, переиграйте меня как можно скорее. Спасибо, пожалуйста, переиграйте меня. –

Смежные вопросы