Отправка файла с iOS на PHP с помощью POST

Я пытаюсь отправить аудиофайл на сервер PHP. Вот код Objective-C:

NSData *data = [NSData dataWithContentsOfFile:filePath]; NSLog(@"File Size: %i",[data length]); //set up request NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; //required xtra info NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; //body of the post NSMutableData *postbody = [NSMutableData data]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"thefile\"; filename=\"recording\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:data]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; apiConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

И вот код PHP:

 if (is_uploaded_file($_FILES['thefile']['tmp_name'])) { echo "FILE NAME: ".$_FILES['thefile']['name']; } else { echo "Nothing"; } 

Размер файла зависит от длины записываемого аудио, но есть данные.

Я получаю ответ «Ничего».

Чтобы отладить: на стороне PHP попробуйте:

 $file = $_POST['name']; echo $file 

Попробуйте следующий сегмент кода вместо вашего текущего кода. Измените URL (www.yourWebAddress.com) и имя скрипта на соответствующие значения для вашей проблемы.

 NSData *data = [NSData dataWithContentsOfFile:filePath]; NSMutableString *urlString = [[NSMutableString alloc] initWithFormat:@"name=thefile&&filename=recording"]; [urlString appendFormat:@"%@", data]; NSData *postData = [urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSString *baseurl = @"https://www.yourWebAddress.com/yourServerScript.php"; NSURL *url = [NSURL URLWithString:baseurl]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod: @"POST"]; [urlRequest setValue:postLength forHTTPHeaderField:@"Content-Length"]; [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [urlRequest setHTTPBody:postData]; NSURLConnection *connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self]; [connection start]; NSLog(@"Started!"); 

На конце сервера у меня есть следующий код:

 <?php $name = $_POST['name']; $filename = $_POST['filename']; echo "Name = '" . $name . "', filename = '" . $filename . "'."; error_log ( "Name = '" . $name . "', filename = '" . $filename . "'." ); ?> 

Я получил следующий результат:

[23-May-2012 11:56:18] Name = 'thefile', filename = 'recording'.

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

Удачи!

Попробуйте кодировать свои двоичные данные, прежде чем отправлять их по каналу (и затем декодировать, когда он дойдет до другого конца). См. Этот поток SO для идей для кода кодировки Base64.

В быстром состоянии вы можете опубликовать как это ..

  func wsPostData(apiString: String, jsonData: String) -> Void { //apiString means base URL let postData = jsonData.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true) let postLenth = "\(UInt((postData?.length)!))" let request = NSMutableURLRequest() request.URL = NSURL(string: apiString) request.HTTPMethod = "POST" request.setValue(postLenth, forHTTPHeaderField: "Content-Lenth") request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.HTTPBody = postData NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse?, data: NSData?, error:NSError?) in print("response\(response)") var dict:NSDictionary! do { dict = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String: AnyObject] print(" responce data is \(dict)") } catch let error as NSError { print("Something went wrong\(error)") } } }