Загрузка аудио файла с использованием HTTP POST в Objective-C - PullRequest
0 голосов
/ 13 января 2011

HI

Я пытался загрузить аудиофайл (sample.wav) на мой сервер, используя метод HTTP POST, выполнив следующий код. Нет ошибки подключения к серверу, но файл не загружается. Я потратил часы, чтобы найти решение для этого, но пока не смог найти. Вот код, который я использовал для выполнения задачи.

     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"wav"];

    // NSLog(@"filePath : %@", filePath);



     NSData *postData = [[NSData alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];

     NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

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



     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

     [request setHTTPMethod:@"POST"];

     [request setURL:[NSURL URLWithString:@"http://exampleserver.com/upload.php"]];



     NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];

     NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

     [request addValue:contentType forHTTPHeaderField: @"Content-Type"];



     [request setValue:postLength forHTTPHeaderField:@"Content-Length"];



     [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

     [request setHTTPBody:postData];

     [request setTimeoutInterval:30.0];



     NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];



     if (conn)

     {

        receivedData = [[NSMutableData data] retain];

     } else {

        NSLog(@"Connection Failed");

     }



     //[request release];

Затем я использую методы делегатов NSURLConnection, чтобы получить ответ от моего сервера. Он пытается подключиться к серверу, но ответа нет. Кто-нибудь может помочь мне в этом отношении. А также вот простой HTML-код, который я использовал для загрузки через простой веб-браузер.

<form action="http://exampleserver.com/upload.php" method="post" name="adminForm" id="adminForm" enctype="multipart/form-data"  >



                        <input type="file"  name="filename" />

И последнее, что мы должны передать имени для поля ввода, которое в данном случае является «имя файла». Я не знаю, как передать это в цель-с. Поэтому, пожалуйста, кто-нибудь может указать мне правильное направление. Любая помощь будет принята с благодарностью.

С уважением,

Арслан

1 Ответ

3 голосов
/ 16 января 2011

В вашей кодировке HTTP отсутствуют некоторые биты.Вы не можете просто добавить данные файла.

ваше тело HTTP должно содержать:

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

//add your filename entry
NSString *contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", @"filename", @"your file name"];

[postData appendData:[contentDisposition dataUsingEncoding:NSUTF8StringEncoding]];

[postData appendData:[NSData dataWithContentsOfFile:@"your file path"];
NSString *endItemBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary];

[postData appendData:[endItemBoundary dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postData];

С этим кодом вы будете ближе к тому, что ожидает ваш сервер HTTP.Чтобы завершить свою работу, вы можете рассмотреть возможность использования Wireshark для определения того, какие байты проходят по проводам вместе с вашим кодом и вашими байтами.

Кодирование HTTP «сложно сделать правильно для вашего собственного» кода.Вы можете удалить этот код и использовать библиотеки высшего уровня, такие как GTMHTTFetcher или ASIHTTPRequest.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...