цель c — выгрузка файла с помощью 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 для обработки этой загрузки. Я проверил это с почтальоном, и он принимает загрузки нормально (ожидая файл с именем «файл»).

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

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

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

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

1

Решение

При использовании 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

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

8

Другие решения

Других решений пока нет …