У меня есть система загрузки видео в приложении 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-скрипт
При использовании 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
Надеюсь, это поможет.