Загрузка файла с помощью NSURLSessionUploadTask на PHP-сервер

У меня есть система загрузки видео в приложении iOS, используя NSURLSessionUploadTask . Видеофайл сохраняется в NSURL поэтому я использую следующий код в методе загрузки:

 request.HTTPMethod = @"POST"; [request addValue:@"file" forHTTPHeaderField:@"fileName"]; // Create upload task NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromFile:filePath completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if(!error) { // handle success } else { // handle error } }]; // Run the task [task resume]; 

У меня есть PHP-сервер (используя Laravel) под управлением nginx для обработки этой загрузки. Я тестировал его с помощью Postman, и он принимает заказы в порядке (ожидая файл под именем «файл»).

Когда я запускаю вышеуказанный код objc, сервер сообщает мне, что файл не был загружен (массив $_FILES пуст).

Я попытался с и без установки заголовка «fileName», и я попытался установить «Content-Type» в «multipart / form-data», но ни одна из них не работает.

Как я могу заставить NSURLSessionUploadTask правильно загружать эти файлы (из NSURL ) на сервер?

Это сообщение, похоже, детализирует аналогичную проблему: NSURLSessionUploadTask не передает файл в php-скрипт

Solutions Collecting From Web of "Загрузка файла с помощью NSURLSessionUploadTask на PHP-сервер"

При использовании NSURLSessionUploadTask [uploadTaskWithRequest: fromFile:] файл отправляется в тело запроса как двоичный.

Чтобы сохранить этот файл в PHP, вы можете просто получить тело запроса и сохранить его в файле.

Очевидно, что лучше всего сделать какую-то проверку формата файла.

Код Objective-C:

 // Define the Paths NSURL *URL = [NSURL URLWithString:kDestinationURL]; // Create the Request NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL]; [request setHTTPMethod:@"POST"]; // Configure the NSURL Session NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.upload"]; config.HTTPMaximumConnectionsPerHost = 1; NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; // Define the Upload task NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:audioRecorder.url]; // Run it! [uploadTask resume]; 

Код PHP:

 <?php // File Path to save file $file = 'uploads/recording.m4v'; // Get the Request body $request_body = @file_get_contents('php://input'); // Get some information on the file $file_info = new finfo(FILEINFO_MIME); // Extract the mime type $mime_type = $file_info->buffer($request_body); // Logic to deal with the type returned switch($mime_type) { case "video/mp4; charset=binary": // Write the request body to file file_put_contents($file, $request_body); break; default: // Handle wrong file type here } ?> 

Я написал пример кода для записи звука и загрузки его на сервер здесь: https://github.com/gingofthesouth/Audio-Recording-Playback-and-Upload

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