PHP

PHP로 이미지 업로드 및 처리하기

thebasics 2024. 9. 18. 10:00

목차
1. 이미지 업로드 개요
   - 이미지 업로드의 중요성
   - 파일 업로드의 기본 원리
2. 파일 업로드 기본 설정
   - HTML 폼 생성
   - 파일 업로드 처리
3. 이미지 리사이즈 및 썸네일 생성
   - GD 라이브러리를 사용한 이미지 리사이즈
   - 이미지 썸네일 생성
4. 코드 예제
5. 결론 및 추가 학습 자료


1. 이미지 업로드 개요

이미지 업로드의 중요성

이미지 업로드는 웹 애플리케이션에서 사용자 생성 콘텐츠를 다루는 데 필수적인 기능입니다. 이미지 업로드 기능은 사용자 프로필, 게시물, 제품 사진 등 다양한 용도로 사용됩니다. PHP를 사용하면 이미지 업로드를 간단하게 구현할 수 있으며, 업로드된 이미지를 처리하여 리사이즈하거나 썸네일을 생성하는 작업도 수행할 수 있습니다.

파일 업로드의 기본 원리

PHP에서 파일 업로드는 사용자가 선택한 파일을 서버로 전송하고, 서버에서 이를 지정된 디렉토리에 저장하는 방식으로 이루어집니다. 업로드된 파일은 PHP의 '$_FILES' 배열에 저장되며, 이를 통해 파일의 이름, 크기, 타입 등을 확인하고 처리할 수 있습니다.


2. 파일 업로드 기본 설정

HTML 폼 생성

먼저, 사용자가 이미지를 업로드할 수 있는 HTML 폼을 생성합니다. 이 폼은 'multipart/form-data' 인코딩 타입을 사용해야 하며, 파일 업로드를 위한 'input' 요소를 포함합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Upload</title>
</head>
<body>
    <h2>Upload Image</h2>
    <form action="upload.php" method="POST" enctype="multipart/form-data">
        <label for="image">Select image:</label>
        <input type="file" id="image" name="image" accept="image/*" required><br><br>
        <button type="submit">Upload</button>
    </form>
</body>
</html>

이 폼에서는 사용자가 이미지를 선택하고 업로드할 수 있도록 파일 선택 필드를 제공하며, 'upload.php' 파일로 폼 데이터를 전송합니다.

파일 업로드 처리

'upload.php' 파일에서는 업로드된 이미지를 처리하고 서버에 저장하는 작업을 수행합니다.

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $targetDir = "uploads/";
    $targetFile = $targetDir . basename($_FILES["image"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));

    // 이미지 파일인지 확인
    $check = getimagesize($_FILES["image"]["tmp_name"]);
    if ($check !== false) {
        echo "File is an image - " . $check["mime"] . ".<br>";
        $uploadOk = 1;
    } else {
        echo "File is not an image.<br>";
        $uploadOk = 0;
    }

    // 파일이 이미 존재하는지 확인
    if (file_exists($targetFile)) {
        echo "Sorry, file already exists.<br>";
        $uploadOk = 0;
    }

    // 파일 크기 제한 (5MB 이하)
    if ($_FILES["image"]["size"] > 5000000) {
        echo "Sorry, your file is too large.<br>";
        $uploadOk = 0;
    }

    // 허용되는 파일 형식 확인
    if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") {
        echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.<br>";
        $uploadOk = 0;
    }

    // 파일 업로드 시도
    if ($uploadOk == 1) {
        if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFile)) {
            echo "The file " . htmlspecialchars(basename($_FILES["image"]["name"])) . " has been uploaded.<br>";
        } else {
            echo "Sorry, there was an error uploading your file.<br>";
        }
    }
}
?>

이 코드는 다음과 같은 작업을 수행합니다:
- 업로드된 파일이 이미지인지 확인합니다.
- 동일한 이름의 파일이 이미 서버에 존재하는지 확인합니다.
- 파일 크기를 확인하여 5MB 이하의 파일만 허용합니다.
- 파일 형식을 확인하여 JPG, JPEG, PNG, GIF 형식만 허용합니다.
- 모든 조건을 만족하면 파일을 서버의 'uploads' 디렉토리에 저장합니다.


3. 이미지 리사이즈 및 썸네일 생성

GD 라이브러리를 사용한 이미지 리사이즈

이미지 업로드 후, 이미지를 리사이즈하여 저장할 수 있습니다. PHP의 GD 라이브러리를 사용하여 이미지를 리사이즈하는 방법은 다음과 같습니다:

<?php
function resizeImage($source, $destination, $width, $height) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $imageResource = imagecreatefromjpeg($source);
    $newImage = imagecreatetruecolor($width, $height);

    imagecopyresampled($newImage, $imageResource, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
    imagejpeg($newImage, $destination, 90);

    imagedestroy($imageResource);
    imagedestroy($newImage);
}

$source = "uploads/" . $_FILES["image"]["name"];
$destination = "uploads/resized_" . $_FILES["image"]["name"];
resizeImage($source, $destination, 800, 600);

echo "Image resized and saved as " . $destination . "<br>";
?>

이 함수는 원본 이미지를 지정된 크기로 리사이즈하고, 새 파일로 저장합니다. 'imagecopyresampled' 함수를 사용하여 이미지의 해상도를 유지하면서 리사이즈 작업을 수행합니다.

이미지 썸네일 생성

썸네일은 작은 크기의 이미지로, 보통 미리보기 용도로 사용됩니다. 다음은 이미지를 썸네일로 리사이즈하는 코드입니다:

<?php
function createThumbnail($source, $destination, $thumbWidth) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $thumbHeight = ($thumbWidth / $originalWidth) * $originalHeight;
    $imageResource = imagecreatefromjpeg($source);
    $thumbnail = imagecreatetruecolor($thumbWidth, $thumbHeight);

    imagecopyresampled($thumbnail, $imageResource, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $originalWidth, $originalHeight);
    imagejpeg($thumbnail, $destination, 90);

    imagedestroy($imageResource);
    imagedestroy($thumbnail);
}

$source = "uploads/" . $_FILES["image"]["name"];
$destination = "uploads/thumb_" . $_FILES["image"]["name"];
createThumbnail($source, $destination, 150);

echo "Thumbnail created and saved as " . $destination . "<br>";
?>

이 함수는 원본 이미지의 비율을 유지하면서 지정된 너비에 맞게 이미지를 리사이즈하여 썸네일을 생성합니다.


4. 코드 예제

다음은 이미지 업로드, 리사이즈, 썸네일 생성을 통합한 종합적인 예제입니다.

1. HTML 폼 (upload.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Upload and Processing</title>
</head>
<body>
    <h2>Upload Image</h2>
    <form action="upload.php" method="POST" enctype="multipart/form-data">
        <label for="image">Select image:</label>
        <input type="file" id="image" name="image" accept="image/*" required><br><br>
        <button type="submit">Upload</button>
    </form>


</body>
</html>

2. 이미지 업로드 및 처리 (upload.php):

<?php
function resizeImage($source, $destination, $width, $height) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $imageResource = imagecreatefromjpeg($source);
    $newImage = imagecreatetruecolor($width, $height);

    imagecopyresampled($newImage, $imageResource, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
    imagejpeg($newImage, $destination, 90);

    imagedestroy($imageResource);
    imagedestroy($newImage);
}

function createThumbnail($source, $destination, $thumbWidth) {
    list($originalWidth, $originalHeight) = getimagesize($source);
    $thumbHeight = ($thumbWidth / $originalWidth) * $originalHeight;
    $imageResource = imagecreatefromjpeg($source);
    $thumbnail = imagecreatetruecolor($thumbWidth, $thumbHeight);

    imagecopyresampled($thumbnail, $imageResource, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $originalWidth, $originalHeight);
    imagejpeg($thumbnail, $destination, 90);

    imagedestroy($imageResource);
    imagedestroy($thumbnail);
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $targetDir = "uploads/";
    $targetFile = $targetDir . basename($_FILES["image"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));

    $check = getimagesize($_FILES["image"]["tmp_name"]);
    if ($check !== false) {
        echo "File is an image - " . $check["mime"] . ".<br>";
        $uploadOk = 1;
    } else {
        echo "File is not an image.<br>";
        $uploadOk = 0;
    }

    if (file_exists($targetFile)) {
        echo "Sorry, file already exists.<br>";
        $uploadOk = 0;
    }

    if ($_FILES["image"]["size"] > 5000000) {
        echo "Sorry, your file is too large.<br>";
        $uploadOk = 0;
    }

    if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") {
        echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.<br>";
        $uploadOk = 0;
    }

    if ($uploadOk == 1) {
        if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFile)) {
            echo "The file " . htmlspecialchars(basename($_FILES["image"]["name"])) . " has been uploaded.<br>";

            $resizedFile = $targetDir . "resized_" . basename($_FILES["image"]["name"]);
            resizeImage($targetFile, $resizedFile, 800, 600);
            echo "Image resized and saved as " . $resizedFile . "<br>";

            $thumbFile = $targetDir . "thumb_" . basename($_FILES["image"]["name"]);
            createThumbnail($targetFile, $thumbFile, 150);
            echo "Thumbnail created and saved as " . $thumbFile . "<br>";
        } else {
            echo "Sorry, there was an error uploading your file.<br>";
        }
    }
}
?>

코드 분석:
- 첫 번째 파일인 'upload.html'에서는 사용자가 이미지를 선택하여 업로드할 수 있는 HTML 폼을 제공합니다.
- 두 번째 파일인 'upload.php'에서는 업로드된 파일을 처리하고, 서버에 저장한 후 이미지를 리사이즈하고 썸네일을 생성하여 저장합니다.


5. 결론 및 추가 학습 자료

이번 글에서는 PHP로 이미지 업로드 및 처리 작업을 수행하는 방법에 대해 알아보았습니다. 사용자로부터 이미지를 업로드 받아 서버에 저장하고, 이를 리사이즈하거나 썸네일을 생성하는 과정을 통해 이미지 파일을 효율적으로 관리할 수 있습니다. 이러한 기능은 웹 애플리케이션에서 자주 사용되며, 사용자의 경험을 향상시킬 수 있습니다.

추가 학습 자료:
- [PHP 공식 문서 - 파일 업로드](https://www.php.net/manual/en/features.file-upload.php) PHP에서 파일 업로드를 처리하는 방법에 대한 공식 문서입니다.
- [PHP GD 라이브러리](https://www.php.net/manual/en/book.image.php) PHP의 GD 라이브러리를 사용하여 이미지 작업을 수행하는 방법에 대한 문서입니다.
- [W3Schools PHP File Upload](https://www.w3schools.com/php/php_file_upload.asp) PHP 파일 업로드의 기본 개념과 예제를 제공하는 튜토리얼입니다.


이제 PHP를 사용하여 이미지 업로드와 처리 작업을 수행할 수 있습니다. 다양한 프로젝트에서 이러한 기능을 활용하여 사용자 인터페이스와 경험을 향상시켜 보세요!

반응형

'PHP' 카테고리의 다른 글

PHP로 크론 작업 설정하기  (0) 2024.09.20
PHP로 캐싱 구현하기  (0) 2024.09.19
PHP로 세션 기반 인증 시스템 구축하기  (4) 2024.09.17
PHP로 이메일 보내기  (12) 2024.09.16
PHP로 SOAP 및 RESTful 웹 서비스 구현하기  (2) 2024.09.15