목차
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 |