php ios swift file-upload alamofire

Carga de PHP desde iOS usando Alamofire



swift file-upload (3)

El problema está en la función savePhotos de la fuente PHP. También un código adicional escrito en el código de iOS. He eliminado el código adicional. 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); } }

Estoy intentando subir 3 imágenes al servidor desde iOS a mi servicio de PHP. Por alguna razón, la carpeta permanece vacía después de la publicación, pero el resto de los datos se procesan y se mantienen en mysql.

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


Los nombres no coinciden [''userfile''][''photo1''] en tu php. Pero en el lado de iOS, userfile y photo1 nunca se usan. Intenta usar $_FILES[''firstImage'']


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

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