본문 바로가기
PHP

[PHP] 다양한 확장자의 파일을 업로드 해주는 함수

by teamnova 2023. 3. 13.

PHP에서 개발을 하다보면, 파일 여러개를 한 번에 업로드 해야할 때가 있습니다.

파일이 하나가 오든 여러개가 오든 관계 없이 원하는 경로로 파일을 업로드 해주는 메소드입니다.

 

파일명은 "fileUploader.php"으로 해주시고

<?php
$files = $_FILES;
if ($files != null) {
    // 확장자에 맞게 파일을 이동시킵니다
    fileUploader($files);
    print_r($files);
}

/** fileUploader($files)
 * 출력 결과는 아래와 같은 형식입니다.
 *     Array
 *        (
 *            [file1] => Array
 *                (
 *                    [name] => titan_huygens.jpg
 *                    [type] => image/jpeg
 *                    [tmp_name] => /tmp/phpdcM5ud
 *                    [error] => 0
 *                    [size] => 35794
 *                )
 *
 *            [file2] => Array
 *                (
 *                    [name] => spherule_apollo11_big.jpg
 *                    [type] => image/jpeg
 *                    [tmp_name] => /tmp/phpCsrxK9
 *                    [error] => 0
 *                    [size] => 45941
 *                )
 *        )
 */
function fileUploader($files)
{
    // 아래처럼, 배열 안에 원하는 확장자를 넣으면 됩니다.
    //    $allowed_ext = array('jpg', 'jpeg', 'png', 'gif');
    $allowed_ext = array('jpg', 'jpeg', 'gif');

    // $files에서 하나씩 꺼내어 설정한 디렉토리로 이동
    foreach ($files as $each_file) {
        // 변수 정리

        // 에러코드
        $error = $each_file['error'];

        // 파일명
        $src_name = $each_file['name'];

        // 서버에 임시 저장된 이미지의 임시 이름
        $tmp_name = $each_file['tmp_name'];

        // 목적지 경로. 원하는 경로로 바꾸셔서 사용하시면 됩니다.
        $dst_name = "/var/www/html/messenger-php/images/" . $src_name;

        // 확장자
        $ext = array_pop(explode('.', $src_name));

        // 아래 주석을 풀어보시면 변수의 값들을 확인할 수 있습니다.
        //        echo $src_name . "\n";
        //        echo $tmp_name . "\n";
        //        echo $dst_name . "\n";

        // 오류 확인
        if ($error != UPLOAD_ERR_OK) {
            switch ($error) {
                case UPLOAD_ERR_INI_SIZE:
                case UPLOAD_ERR_FORM_SIZE:
                    echo "파일이 너무 큽니다. ($error)";
                    break;
                case UPLOAD_ERR_NO_FILE:
                    echo "파일이 첨부되지 않았습니다. ($error)";
                    break;
                default:
                    echo "파일이 제대로 업로드되지 않았습니다. ($error)";
            }
            exit;
        }

        // 확장자 확인
        if (!in_array($ext, $allowed_ext)) {
            echo "허용되지 않는 확장자인 파일이 있습니다.";
            exit;
        }

        // 파일 이동
        move_uploaded_file($tmp_name, $dst_name);
    }
}

 

아래 사진은, Postman을 활용해서 요청을 보낸 결과입니다. 서버에 file1, file2를 보내면 정상적으로 업로드 됩니다. 에러가 출력되지 않았으니, 이미지 경로($dst_name)로 직접 들어가시면 파일이 있을 것입니다.

아래 사진은, 'png'확장자가 있는 파일이 있기 때문에 에러 메시지를 출력하였습니다.