Search code examples
phpiosswiftfile-uploadalamofire

PHP upload from iOS using Alamofire


I'm trying to upload 3 images to the server from iOS to my PHP service. For some reason the folder remains empty after posting, but the rest of the data goes through and gets persisted into mysql.

My iOS code:

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

}

On my PHP I'm not sure if I'm missing anything here:

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

Solution

  • Problem is in your savePhotos function of PHP source. Also some extra code written in iOS code. I have removed extra code. Try once.

    Here is the iOS code updated

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

    And here is the PHP code

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