Я пытаюсь загрузить 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);
}
}
?>
Проблема в функции 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);
}
}
Имена не совпадают ['userfile']['photo1']
в вашем php. Но на стороне iOS userfile
а также photo1
никогда не используются. Попробуйте использовать $_FILES['firstImage']
попробуйте это, если вы отправляете изображение в формате 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);
?>