php 이미지 사이즈 줄인 후 업로드

php 이미지 사이즈 줄인 후 업로드 하는 방법을 알아보겠습니다.
크기가 큰 이미지 파일이 넘어오는 경우에는 용량을 줄여야 서버에 보관하기도 쉽고,
다른 파일에서 열어볼 때도 시간 지연 없이 열어 볼 수 있기 때문에 줄이는 경우가 많습니다.

php 는 이미지를 업로드 할 때, 임시 파일에 들어있다가 업로드를 하는 방식을 사용합니다.
이미지를 업로드 할 때 임시 파일에 있는 파일을 바로 사이즈를 줄여서 업로드 하는 방법과
이미지를 일단 업로드 하고, 그 폴더에 있는 파일을 사이즈를 줄이는 경우가 있습니다.

> form 형식

아래와 같은 형식이고 아래에서 img, button 은 필요 없습니다.
선택한 이미지를 바로 보여줄 때 사용된 구조입니다.
그리고 주석처리 되어 있는 부분은 php 로 파일을 올릴 수 있는 최대 용량의 제한을 보여주는 form 입니다.

그것도 모르고 이 것 때문에 삽질을 많이 했네요.

 

<form enctype="multipart/form-data" action="imageUpload.php" method="POST">
   
  <img id="mainImg" style="max-width:500px; display: block;" />
  <button class="replace">사진 올리기button>
  <input name="mainImgInput" class="input" type="file" id="mainImgInput" />
  <input type="submit" value="upload" />

필요한 것만 추리면, 위는 아래와 같은 소스 코드로 줄일 수 있습니다.

<form enctype="multipart/form-data" action="imageUpload.php" method="POST">
  <input name="mainImgInput" class="input" type="file" id="mainImgInput" />
  <input type="submit" value="upload" />

>> php 코드 ( 일단 업로드 하고, 업로드 된 파일을 resize 하기 )

<? 
    // 설정
    $uploads_dir = 'userImages/test';
    $allowed_ext = array('jpg','jpeg','png','gif');
 
    // 폴더 존재 여부 확인 ( 없으면 생성 ) 
    if ( !is_dir ( $uploads_dir ) ){
        mkdir( $uploads_dir );
    }
     
    // 변수 정리
    $error = $_FILES['mainImgInput']['error'];
    $name = $_FILES['mainImgInput']['name'];
    $ext = array_pop(explode('.', $name));
     
    // 오류 확인
    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( $_FILES['mainImgInput']['tmp_name'], "$uploads_dir/$name");
 
    // 파일 정보 출력
    echo "
        <h2>파일 정보</h2>
        <p>파일명: $name</p>
        <p>확장자: $ext</p>
        <p>파일형식: {$_FILES['mainImgInput']['type']}</p>
        <p>파일크기: {$_FILES['mainImgInput']['size']} 바이트</p>
        ";
 
 
    // 파일 압축 메소드 
    function compress($source, $destination, $quality) {
 
        $info = getimagesize($source);
 
        if ($info['mime'] == 'image/jpeg') 
            $image = imagecreatefromjpeg($source);
 
        elseif ($info['mime'] == 'image/gif') 
            $image = imagecreatefromgif($source);
 
        elseif ($info['mime'] == 'image/png') 
            $image = imagecreatefrompng($source);
 
        imagejpeg($image, $destination, $quality);
 
        return $destination;
    }
 
    // 파일 리사이즈 후 복사하기
    $source_img = $_FILES['mainImgInput']['tmp_name'];
    $destination_img = $_FILES['mainImgInput']['tmp_name'];
    $d = compress($source_img, $destination_img, 90);
 
?>