Вот мой быстрый код, который загружает файл из приложения.
final class UploadService {
// I'm renting a remote server and the php code is on that
private let videoUploadPath = "http://myUploadPath.php"
var uploadsSession: URLSession!
var activeUploads: [URL: Upload] = [:]
func startUpload(medium: Medium) {
guard let url = URL(string: videoUploadPath) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
let upload = Upload(medium: medium)
upload.task = self.uploadsSession.uploadTask(with: request, fromFile: medium.avUrlAsset.url)
upload.task?.resume()
upload.isUploading = true
activeUploads[upload.medium.avUrlAsset.url] = upload
}
}
Обратите внимание, что я должен использовать
func uploadTask(with request: URLRequest, fromFile fileURL: URL) -> URLSessionUploadTask
// Apple documentation:
Parameters
request
A URL request object that provides the URL, cache policy, request type,
and so on. The body stream and body data in this request object are ignored.
загружать видео с телефона, так как это единственный метод, который позволяет фоновую загрузку (видео обычно довольно большие, поэтому я ДОЛЖЕН сделать фоновую загрузку возможной). Однако эта функция отбрасывает все данные тела.
Вот мой код PHP, который получает загруженный файл и сохраняет его в нужном месте:
$directory = "../storage/videos/";
$destination = $directory . basename($_FILES["file"]["name"]);
if (move_uploaded_file($_FILES["file"]["tmp_name"], $destination)) {
$returnArray["status"] = "200";
$returnArray["message"] = "Upload success";
echo json_encode($returnArray);
} else {
$returnArray["status"] = "300";
$returnArray["message"] = "Upload failed" . $_FILES["file"]["error"];
echo json_encode($returnArray);
return;
}
Если честно, я знаю, что это не удастся, потому что у меня нет возможности указать тип файла и имя, которые требуются $_FILES["file"]["name"]
в коде PHP.
Поэтому у меня вопрос, как указать имя файла и тип для загрузки? Так как функция
func uploadTask(with request: URLRequest, fromFile fileURL: URL) -> URLSessionUploadTask
отбрасывает все данные тела http, как я уже упоминал, возможно, создав заголовок http, который содержит тип и имя файла? ИЛИ, есть ли другой способ для PHP получить файл, который я только что загрузил? На данный момент $ _FIELS полностью пуст. Я новичок в PHP, извините, если я не сказал это достаточно ясно.
Также для Content-Type
Я использовал multipart/form-data
когда я загружаю изображение, чтобы изменить изображение профиля пользователя, я добавляю данные изображения вместе с другими данными, такими как uid
, затем прикрепите эти данные как данные тела в теле http. Но теперь мне нужно загрузить один файл, потому что все данные тела в запросе будут игнорироваться в соответствии с требованием iOS. Как я могу это сделать?
Многие дни застряли в этом, пожалуйста, помогите. Большое спасибо!!
Задача ещё не решена.
Других решений пока нет …