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