Carga de PHP desde iOS usando Alamofire

Estoy intentando upload 3 imágenes al server desde iOS a mi service PHP. Por alguna razón, la carpeta permanece vacía después de la publicación, pero el rest de los datos pasan y se mantiene en mysql.

Mi código 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) } }) } 

En mi PHP no estoy seguro si me falta algo aquí:

  <?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); } } ?> 

El problema está en su function savePhotos de la fuente PHP. También algún código extra escrito en el código iOS. He eliminado el código extra. Trata una vez.

Aquí está el código de iOS actualizado

 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) } }) } 

Y aquí está el código 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); } } 

Los nombres no coinciden con ['userfile']['photo1'] en su php. Pero en el userfile iOS userfile y photo1 nunca se utilizan. Intente usar $_FILES['firstImage']

intente esto si envía la image en formatting json (repita el mismo código para otras imágenes mediante el nombre de la image)

 <?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); ?>