Проблема с POSTing аудио файл в PHP с iOS

Я записываю аудио (как .m4a) в моем приложении. Это работает просто отлично. Я могу создать эти данные и отправить их в свой PHP-скрипт, и он будет загружен. Тем не менее, он больше не является действительным аудиофайлом — он не может быть воспроизведен при загрузке с моего публичного сервера. Вот код для завершения записи, генерации тела с заголовками и моего PHP. Я также предоставляю ответ от сервера, который показывает некоторые вещи, которые я считаю нужными исправить, но не уверен в этом.

func finishRecording(success: Bool)
{
if success
{
if NSData(contentsOf: audioRecorder.url) != nil
{
let destUrl = URL(string: destinationURL)
let request = NSMutableURLRequest(url: destUrl!)
request.httpMethod = "POST"let param = ["firstName": "Eric", "lastName": "Dolecki", "userId": "5"]
let boundary = "Boundary-\(NSUUID().uuidString)"request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

do {
let f = try FileHandle(forReadingFrom: audioRecorder.url)
let data = f.readDataToEndOfFile()
print(data) // i.e. 66505 bytes
f.closeFile()

// Lets send the file to the PHP script to save it.
request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file", audioDataKey: data as NSData, boundary: boundary) as Data
let task = URLSession.shared.dataTask(with: request as URLRequest)
{
data, response, error in
if error != nil {
print("error=\(String(describing: error))")
return
}

print("Response = \(String(describing: response))")
let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print("Response data = \(responseString!)")
}
task.resume()
} catch {
...

Вот функция создания тела:

func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?,
audioDataKey: NSData, boundary: String) -> NSData {
let body = NSMutableData();
if parameters != nil {
for (key, value) in parameters! {
body.appendString(string: "--\(boundary)\r\n")
body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.appendString(string: "\(value)\r\n")
}
}
let filename = "recording.m4a"let mimetype = "audio/m4a"body.appendString(string: "--\(boundary)\r\n")
body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
body.append(audioDataKey as Data)
body.appendString(string: "\r\n")
body.appendString(string: "--\(boundary)--\r\n")
return body
}
}

extension NSMutableData {
func appendString(string: String) {
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
append(data!)
}
}

Вот PHP:

<?php
$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$userId = $_POST["userId"];

$target_dir = "assets";
$target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]);

if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir))
{
echo "Status Okay: " . $firstName . ", " . $lastName . " : " . $userId . " " . $target_dir;

} else {
echo "Error uploading";
}

?>

Ответ сервера:

Connection =     (
"Keep-Alive");
"Content-Encoding" =     (
gzip
);
"Content-Length" =     (
50
);
"Content-Type" =     (
"text/html");
Date =     (
"Wed, 22 Aug 2018 13:29:04 GMT");
"Keep-Alive" =     (
"timeout=5, max=100");
Server =     (
"Apache/2.2.34");
Vary =     (
"User-Agent,Accept-Encoding");
"X-Powered-By" =     (
"PHP/5.3.29");

Ответ, который я получаю, имеет тип содержимого text / html и кодировку содержимого gzip. Это не может быть хорошо. Я думаю, что это нужно решать — вместо multipart / form-data, что это должно быть (если это решение)? Будет ли PHP перезаписывать файл, который уже существует?

Спасибо за ваше время и внимание.

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector