Загрузка PHP с iOS с использованием Alamofire

Я пытаюсь загрузить 3 изображения на сервер с iOS в мой сервис PHP.
По какой-то причине папка остается пустой после публикации, но остальные данные проходят и сохраняются в mysql.

Мой код iOS:

Alamofire.upload(.POST, urlString, multipartFormData: {
multipartFormData in

if (firstPhoto != nil) {
if  let firstImageData = UIImageJPEGRepresentation(firstImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: firstImageData, name: "firstImage", fileName: "firstImage.png", mimeType: "image/png")
}
}

if (secondPhoto != nil) {
if  let secondImageData = UIImageJPEGRepresentation(secondImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: secondImageData, name: "secondImage", fileName: "secondImage.png", mimeType: "image/png")
}
}

if (thirdPhoto != nil) {
if  let thirdImageData = UIImageJPEGRepresentation(thirdImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: thirdImageData, name: "thirdImage", fileName: "thirdImage.png", mimeType: "image/png")
}
}if  let imageData = UIImageJPEGRepresentation(firstImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png")
}

if  let imageData = UIImageJPEGRepresentation(firstImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png")
}for (key, value) in parameters {
multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
}

}, encodingCompletion: {
encodingResult in

switch encodingResult {
case .Success(let upload, _, _):
print("Запрос отправлен")
upload.responseJSON { response in
print(response.request)  // original URL request
print(response.response) // URL response
print(response.data)     // server data
print(response.result)   // result of response serialization

if let JSON = response.result.value {
print("JSON: \(JSON)")
}
completion(response.result.value)
}

case .Failure(let encodingError):
print(encodingError)
completion(nil)
}
})

}

На моем PHP я не уверен, что я что-то здесь упускаю:

 <?php

require_once 'Functions/common_functions.php';
require_once 'Functions/engine.php';
require_once 'Functions/json.php';
require_once 'Functions/check_token.php';

if (count($_REQUEST) == 6) {
foreach($_REQUEST as $k => $v) {
if (strlen($k) > 0 && strlen($v) > 0) {
$_REQUEST[$mysqli->real_escape_string($k)] = $mysqli->real_escape_string($v);
} else {
die(errorJSON("Empty parameter", "666"));
}
}

$userID = checkAccessToken($_REQUEST['access_token'], $mysqli);

if ($userID == 0) {
die(errorJSON("Incorrect access token", "666"));
}

$mysqli->query('INSERT INTO Book (title, authorID, detail, price, categoryID, conditionText) VALUES ("'.$_REQUEST['title'].'", "'.$userID.'", "'.$_REQUEST['detail'].'", "'.$_REQUEST['price'].'", "'.$_REQUEST['categoryID'].'", "'.$_REQUEST['condition'].'")');

$insertID = $mysqli->insert_id;

if ($insertID > 0) {
savePhotos($mysqli, $insertID);
$message = book($insertID, $userID, $mysqli);
die(successJSON($message));
} else {
die(errorJSON("Failed insert book in database", "666"));
}
} else {
die(errorJSON("Incorrect count of parameter" .  count($REQUEST) . count($_POST), "666"));
}

function savePhotos($mysqli, $bookID) {
if(!is_dir('/home/thebakpa/resources/book_photos/')) {
mkdir('/home/thebakpa/resources/book_photos/', 0777, true);
}
try {
$uploaddir = '/home/thebakpa/resources/book_photos/';
$file = $_FILES['userfile']['photo1'];

if ($file != 0) {
$uploadfile = $uploaddir . $file;

$name = "photo1-".$bookID;
$photoPath = '/home/thebakpa/resources/book_photos/'.$name.'.jpg';

$mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.'');
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
}

$file = $_FILES['userfile']['photo2'];

if ($file != 0) {
$uploadfile = $uploaddir . $file;

$name = "photo2-".$bookID;
$photoPath = '/home/thebakpa/resources/book_photos/'.$name.'.jpg';

$mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.'');
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
}

$file = $_FILES['userfile']['photo3'];

if ($file != 0) {
$uploadfile = $uploaddir . $file;

$name = "photo3-".$bookID;
$photoPath = '/home/thebakpa/resources/book_photos/'.$name.'.jpg';

$mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.'');
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
}
} catch(Exception $ex){
echo "ERROR:".$ex->GetMessage()."\n";
exit(1);
}
}
?>

9

Решение

Проблема в функции savePhotos исходного кода PHP. Также некоторый дополнительный код написан в коде iOS. Я удалил дополнительный код. Попробуй один раз.

Вот обновленный код iOS

Alamofire.upload(.POST, urlString, multipartFormData: {
multipartFormData in

if (firstPhoto != nil) {
if  let firstImageData = UIImagePNGRepresentation(firstImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: firstImageData, name: "firstImage", fileName: "firstImage.png", mimeType: "image/png")
}
}

if (secondPhoto != nil) {
if  let secondImageData = UIImagePNGRepresentation(secondImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: secondImageData, name: "secondImage", fileName: "secondImage.png", mimeType: "image/png")
}
}

if (thirdPhoto != nil) {
if  let thirdImageData = UIImagePNGRepresentation(thirdImage!, 0.6) {
print("uploading image");
multipartFormData.appendBodyPart(data: thirdImageData, name: "thirdImage", fileName: "thirdImage.png", mimeType: "image/png")
}
}

for (key, value) in parameters {
multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
}

}, encodingCompletion: {
encodingResult in

switch encodingResult {
case .Success(let upload, _, _):
print("Запрос отправлен")
upload.responseJSON { response in
print(response.request)  // original URL request
print(response.response) // URL response
print(response.data)     // server data
print(response.result)   // result of response serialization

if let JSON = response.result.value {
print("JSON: \(JSON)")
}
completion(response.result.value)
}

case .Failure(let encodingError):
print(encodingError)
completion(nil)
}
})

}

А вот и код PHP

function savePhotos($mysqli, $bookID) {
$basePath = '/home/thebakpa/resources/book_photos/'
if(!is_dir($basePath)) {
mkdir($basePath, 0777, true);
}
try {
$file1 = $_FILES['firstImage'];

if (is_uploaded_file($file1['tmp_name'])) {
$photoPath = $basePath.'photo1-'.$bookID.'.jpg';

if (move_uploaded_file($file1['tmp_name'], $photoPath)) {
$mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.'');
}
}

$file2 = $_FILES['secondImage'];

if (is_uploaded_file($file2['tmp_name'])) {
$photoPath = $basePath.'photo2-'.$bookID.'.jpg';

if (move_uploaded_file($file2['tmp_name'], $photoPath)) {
$mysqli->query('UPDATE Book SET photo2='.$photoPath.' WHERE bookID='.$bookID.'');
}
}

$file3 = $_FILES['thirdImage'];

if (is_uploaded_file($file3['tmp_name'])) {
$photoPath = $basePath.'photo3-'.$bookID.'.jpg';

if (move_uploaded_file($file3['tmp_name'], $photoPath)) {
$mysqli->query('UPDATE Book SET photo3='.$photoPath.' WHERE bookID='.$bookID.'');
}
}
} catch(Exception $ex){
echo "ERROR:".$ex->GetMessage()."\n";
exit(1);
}
}
6

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

Имена не совпадают ['userfile']['photo1'] в вашем php. Но на стороне iOS userfile а также photo1 никогда не используются. Попробуйте использовать $_FILES['firstImage']

1

попробуйте это, если вы отправляете изображение в формате json (повторите тот же код для других изображений, поменяв имя изображения)

<?php

$image          = $file;
$directorypath1 = $uploaddir;
$img            = str_replace('data:image/PNG;base64,', '', $image);
$img            = str_replace(' ', '+', $img);
$data           = base64_decode($img);
$name           = rand() . '_' . time() . ".jpg";
$img_path       = $directorypath1 . $name;
file_put_contents($img_path, $data);

?>
1