Загрузить изображение на веб-сервер через JSON в ios, используя переполнение стека

У меня есть приложение, в котором я загружаю данные пользователя на веб-сервер.

Я использую приведенный ниже код для передачи данных на веб-сервер с кодом ниже.

-(IBAction)btnRegister:(id)sender
{
jsonSP = [SBJSON new];
jsonSP.humanReadable = YES;

NSString *service = @"/register.php";
NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"register_btn.png"]);
[Base64 initialize];
NSString *imageString = [Base64 encode:imageData];
NSLog(@"%@",imageString);NSString *requestString = [NSString stringWithFormat:@"{\"?username\"=\"%@\"&\"user_password\"=\"%@\"&\"first_name\"=\"%@\"&\"email\"=\"%@\"&\"profile_photo_link\"=\"%@\"\"}",@"Test",@"Test",@"Test",@"Test@mmm.com",imageString];
NSData *requestData = [NSData dataWithBytes: [requestString UTF8String] length: [requestString length]];

NSString *fileLoc = [[NSBundle mainBundle] pathForResource:@"URLName" ofType:@"plist"];
NSDictionary *fileContents = [[NSDictionary alloc] initWithContentsOfFile:fileLoc];
NSString *urlLoc = [fileContents objectForKey:@"URL"];
urlLoc = [urlLoc stringByAppendingString:service];
NSLog(@"URL : %@",urlLoc);
// urlLoc = [urlLoc stringByAppendingString:@"?username=abcd&password=abcd"];
urlLoc = [urlLoc stringByAppendingString:requestString];
urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"{" withString:@""];
urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"}" withString:@""];
urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSLog(@"URL : %@",urlLoc);
// [fileContents release]; //o_r
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: urlLoc]];
NSString *postLength = [NSString stringWithFormat:@"%d", [requestData length]];
[request setHTTPMethod: @"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody: requestData];

//    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

NSError *respError = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: &respError ];
NSLog(@"response is %@",returnData);// [request release];
if (respError)
{
//[customSpinner hide:YES];

UIAlertView *alt=[[UIAlertView alloc]initWithTitle:@"Internet connection is not Available!" message:@"Check your network connectivity" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alt show];
//[alt release];}
else
{
NSString *responseString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];
NSLog(@"response string %@",responseString);
}
}

Я успешно могу отправить данные на веб-сервер без изображения.

Но если загрузить изображение с кодом, показанным выше, кодируя Base64, данные не будут загружены на веб-сервер. Это дает мне ошибку в NSLog, говоря, что строка запроса слишком длинная.

Я уже импортировал файлы Base64.h и .m.

Я хочу также передать данные с изображением.

Как я могу это сделать?

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

Пожалуйста, помогите мне.

Заранее спасибо.

1

Решение

Эй, Мантан Попробуйте этот приведенный ниже код для преобразования UIImage в NSString а затем передать его на сервер

        UIImage *imgPic =[UIImage imageNamed:@"register_btn.png"];
NSData * imageData =  UIImagePNGRepresentation(imgPic);
NSString *base64String = [imageData base64EncodedStringWithOptions:0];
0

Другие решения

это проблема с сервером, и он говорит вам с этой ошибкой.

Не существует максимальной длины для JSON, но есть максимальное количество данных, которые вы можете отправить. Чтобы это исправить, просто установите объем данных, которые вы можете отправить в файле .htaccess: php_value post_max_size 20M

РЕДАКТИРОВАТЬ

Кроме того, если у вас есть доступ к php.ini, вы можете изменить его в post_max_size строка

0

Попробуйте вот так;

- (void)addNewItem:(SH_NewItem *)newItem withCompletitionBlock:(void(^)(NSArray *items, NSError *error, NSDictionary *userInfo))completitionBlock
{
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:[[SH_Shared sharedInstance] getBaseURL]]];

//main cover image...
NSData *imageData = UIImageJPEGRepresentation(newItem.image, JPEG_IMAGE_QUALITY);NSData *imageData1 = UIImageJPEGRepresentation(newItem.image1, JPEG_IMAGE_QUALITY);
NSData *imageData2 = UIImageJPEGRepresentation(newItem.image2, JPEG_IMAGE_QUALITY);
NSData *imageData3 = UIImageJPEGRepresentation(newItem.image3, JPEG_IMAGE_QUALITY);
NSData *imageData4 = UIImageJPEGRepresentation(newItem.image4, JPEG_IMAGE_QUALITY);

NSDictionary *params  = [[NSDictionary alloc]init];

params = [NSDictionary dictionaryWithObjectsAndKeys:
newItem.title, @"title",
newItem.itemDescription, @"description",
[[SH_Shared sharedInstance] token], @"token",
nil];

NSLog(@"params-%@",params);

NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"new_item" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) {
if (imageData != nil)
[formData appendPartWithFileData:imageData name:@"images[0]" fileName:@"image_ad.png" mimeType:@"multipart/form-data"];if (imageData1 != nil)
[formData appendPartWithFileData:imageData1 name:@"images[1]" fileName:@"image_ad1.png" mimeType:@"multipart/form-data"];
if (imageData2 != nil)
[formData appendPartWithFileData:imageData2 name:@"images[2]" fileName:@"image_ad2.png" mimeType:@"multipart/form-data"];
if (imageData3 != nil)
[formData appendPartWithFileData:imageData3 name:@"images[3]" fileName:@"image_ad3.png" mimeType:@"multipart/form-data"];
if (imageData4 != nil)
[formData appendPartWithFileData:imageData4 name:@"images[4]" fileName:@"image_ad4.png" mimeType:@"multipart/form-data"];

}];AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[self getDataWithOperation:op completitionBlock:^(NSData *data, NSError *error, NSDictionary *userInfo) {
CJSONDeserializer *deserializer = [CJSONDeserializer deserializer];

NSError *deserializeError = nil;

NSString *str = [[NSString alloc]  initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"Response: %@", str);NSDictionary *requestResponseDict = [deserializer deserialize:data error:&deserializeError];

NSString *status = [requestResponseDict valueForKey:kStatus];

BOOL isSuccess = [[status valueForKey:kSuccess] boolValue];

if (isSuccess)
{
// it's OK

}
else
{
// its error
}
}];
}
0

Я сделал это, работая со следующим кодом с данными из нескольких частей формы.

responseData = [NSMutableData data];
NSString *service = @"http:///registerUser.php";

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:service]];
[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]];
[body appendData:[@"Content-Disposition: form-data; name=\"profile_photo_link\"; filename=\"ipodfile.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

UIImageView *imgvUserImage = [[UIImageView alloc]init];
imgvUserImage.image= [UIImage imageNamed:@"register_btn.png"];

NSData * imageData=[NSData dataWithData:UIImagePNGRepresentation(imgvUserImage.image)];

[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"%@",txtUserName.text] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

// устанавливаем тело сообщения в запрос

 [request setHTTPBody:body];
postconnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];

** для ответа

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[self removeProgressIndicator];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (connection == postconnection)
{
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"%@",responseString);
//   NSDictionary *deserializedData = [responseString objectFromJSONString];
//  NSString *string = [deserializedData objectForKey:@"Status"];}
}
0