Сервер не получает должным образом запрос POST от ASIFormDataRequest в Objective-C
Я пытаюсь использовать ASIFormDataRequest в приложении iPhone для отправки только что записанного видео на сервер вместе со строкой, которую я могу использовать для идентификации того, кому принадлежит видео. Код для этого здесь:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSURL *urlvideo = [info objectForKey:UIImagePickerControllerMediaURL];
NSString *urlString=[urlvideo path];
NSLog(@"urlString=%@",urlString);
NSString *str = [NSString stringWithFormat:@"http://www.mysite.com/videodata.php"];
NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
NSData *patientData = [_patientCode dataUsingEncoding:NSUTF8StringEncoding];
[request setFile:urlString forKey:@"video"];
[request setData:patientData forKey:@"patientcode"];
[request setRequestMethod:@"POST"];
[request setDelegate:self];
[request startSynchronous];
NSLog(@"responseStatusCode: %i",[request responseStatusCode]);
NSLog(@"responseString: %@",[request responseString]);
[picker dismissViewControllerAnimated:YES completion:nil];
}
Кажется, все работает правильно, я возвращаю код состояния 200, и метод завершается, как и ожидалось. Тем не менее, кажется, что php-файл на сервере ничего не получает. Я добавил эту строку в свой php-код на стороне сервера:
echo(count($_POST));
Возвращает 0, поэтому кажется, что ASIFormDataRequest фактически ничего не публикует. Я чувствую, что мог бы быть какой-то простой шаг, который я пропускаю, поскольку я никогда не использовал ASIFormDataRequest прежде, но любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: я изменил setData:patientData
в setPostValue:_patientCode
и теперь эта часть сообщения отправляется правильно, так что кажется, что setPostValue
работает но setData
а также setFile
не делайте.
2 ответа
В итоге я нашел ответ, читая что-то еще, и заметил, что они сделали что-то интересное: загруженный файл просто входил в $_FILES
массив, а не $_POST
массив. Я тоже поменял [request setData:patientData forKey:@"patientcode"];
в [request setPostValue:_patientCode forKey:@"patientCode"];
а потом это появилось в $_POST
массив, как я хотел, чтобы я мог получить и строку, которую я отправлял, и файл, который я отправлял в моем сценарии php.
Вы должны использовать -addData:forKey:
а также -addFile:forKey:
вместо -setData:forKey:
а также -setFile:forKey:
,
Кроме этого, проверьте выходные данные отладки при компиляции с DEBUG_FORM_DATA_REQUEST
,
Вы должны отправить multipart/form-data
запрос при использовании -addFile:forKey:
и application/x-www-form-urlencoded
запрос при использовании -addPostValue:forKey:
,
Ваш сервер обрабатывает multipart/form-data
Запросы?