Сервер не получает должным образом запрос 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 Запросы?

Другие вопросы по тегам