2015-03-26 3 views
0

Я новый разработчик IOS, и у меня возникает проблема с головной болью, связанная с использованием multipart для загрузки файла и некоторого текста, я много пробовал hereIOS: получение «400 Bad Request» при использовании multipart/form-data

Код статуса всегда возвращает 400. Я устал тестировать свой веб-сервис другим способом, например, создавать клиент Rest Rest http://www.httpComponent API, используя клиент RestEASY, и оба они успешно работали, как смешно!

Я использую Xcode 6.1.1, мой исходный код:

-(void)uploadPhoto { 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://localhost/my-rest-service"]]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
[request setHTTPShouldHandleCookies:NO]; 
[request setTimeoutInterval:60]; 
[request setHTTPMethod:@"POST"]; 
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"avatar_temp"], 1.0); 
NSString *boundary = @"12345-6789-abc"; // 
// set Content-Type in HTTP header 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 
// post body 
NSMutableData *body = [NSMutableData data]; 
// add params (all params are strings) 
[body appendData:[[NSString stringWithFormat:@"%@--", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n", @"type"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"%@\r\n", @"HELLO"] dataUsingEncoding:NSUTF8StringEncoding]]; 
// setting the body of the post to the request 
[request setHTTPBody:body]; 
// set the content-length 
NSString *postLength = [NSString stringWithFormat:@"%d", [body length]]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
if(data.length > 0){ 
//success 
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSLog(@"[String] %@", str); 
} 
}]; 
} 

Любые предложения помогут мое исследование

Благодаря

+2

Покажите нам код, который вы используете для загрузки. –

+0

Привет! Я только что обновил контент –

ответ

0

Вы забыли добавить ImageData так добавить :

 [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 setHTTPMethod:@"POST"]; 
     NSData *imageData = UIImageJPEGRepresentation(imageToSave,0.9);  //change imageToSave with your own UIImage defined 
     NSString *filenames = @"first field"; 
     NSString *token = @"second field"; 
     NSString *boundary = @"---------------------------14738723651466499882746641449"; 
     NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
     [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

     NSMutableData *body = [NSMutableData data]; 
     ////+++ first form field for post -> for example a field called filenames see NSString above 
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"filenames\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[filenames dataUsingEncoding:NSUTF8StringEncoding]]; 
     ////--- the second field for form post-> we named token see above NSString 

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

     ////+++ the file used to upload /post 

     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"ceva.jpg\"\r\n"] 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]]; 
     ////--- 

     // setting the body of the post to the reqeust 
     [request setHTTPBody:body];   // now lets make the connection to the web 

Теперь все вы хотите сделать, это проверить ваш код PHP на стороне сервера.

-1

На самом деле я создал базу обслуживания отдыха на RestEasy и Jboss AS 7. Я хотел бы отправить как файл, так и текст, поэтому я делаю тест только с текстовыми данными. С php-кодом для службы все в порядке, но только Java становится проблемой. My rest service definition:

@POST 
@Consumes("multipart/form-data") 
@Produces("application/json") 
public Response create(@Context HttpHeaders httpHeaders 
     , MultipartFormDataInput multipartFormDataInput) {...} 

Как вы думаете?

+0

Как это ответить на вопрос? – gnasher729

+0

Извините! я снова собираюсь в резюме, но проблема в java.io.IOException: Не удалось получить границу для multipart –

+0

Я обнаружил, что я пропустил «-» в конце части –

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