PHP upload from iOS using Alamofire

筅森魡賤 提交于 2019-12-13 12:56:43

问题


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

回答1:


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



回答2:


The names do not match ['userfile']['photo1'] in your php. But on the iOS side userfile and photo1 are never used. Try using $_FILES['firstImage']




回答3:


try this if you submit image in json format(repeat same code for other images by chnaging image name)

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

?>


来源:https://stackoverflow.com/questions/39261892/php-upload-from-ios-using-alamofire

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!