Skip to main content

PHP Upload Image And Resize Thumbnail

สวัสดีครับ ในวันนี้เราจะมาแนะนำเทคนิค การ Upload ไฟล์ภาพ และ Resize เป็นไฟล์ Thumbnail ด้วย PHP ครับ

โดยในขั้นตอนของการ Resize เราจะใช้  Resize Image Class With PHP  เป็น Class สำหรับการ Resize Image ครับ

มาเริ่มกันเลย ก่อนอื่นต้องมาสร้างฟอร์ม อัพโหลดกันก่อนครับ

<!DOCTYPE html>
<html>
	<body>

	<form action="upload.php" method="post" enctype="multipart/form-data">
	  เลือกไฟล์ภาพ
	  <input type="file" name="fileToUpload" id="fileToUpload">
	  <hr>
	  <input type="submit" value="Upload Image" name="submit">
	</form>

	</body>
</html>

ต่อมาเรามาสร้างไฟล์ upload.php สำหรับ Upload ไฟล์ครับ

อย่าลืมสร้าง Folder uploads ด้วยนะครับใช้สำหรับเก็บไฟล์ที่เราได้ upload แล้ว

<?php

include "ResizeImage.php";//นำเข้า class ResizeImage เข้ามาใช้ในไฟล์

//ตรวจสอบว่ามีการ submit ข้อมูลมาหรือไม่
if(isset($_POST["submit"]) && !empty($_FILES["fileToUpload"]["name"])) {
	
	$target_dir = "uploads/";//ชื่อ Folder สำหรับเก็บไฟล์ที่ Upload

	$path_parts = pathinfo($_FILES["fileToUpload"]["name"]);

	$extension = $path_parts['extension'];//นามสกุลไฟล์

	$filename = date("YmdHis").'.'.$extension;//เปลี่ยนชื่อไฟล์ที่ upload แล้ว

	$target_file = $target_dir.$filename; 

	$newFileThumbnail = $target_dir.date("YmdHis").'_thumbnail.'.$extension;//เปลี่ยนชื่อไฟล์ thumbnail ที่ ลดขนาดแล้ว

		if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
			
			$resize = new ResizeImage($target_file);//เรียกใช้งาน class สำหรับ Resize
			$resize->resizeTo(150, 150, 'exact');//กำหนดขนาดที่ต้องการ Resize กว้าง 150 สูง 150
			$resize->saveImage($newFileThumbnail);//สร้างไฟล์ที่ลดขนาดแล้ว
			
			echo "The file ". htmlspecialchars($filename). " has been uploaded.";
			
	    } else {
			echo "Sorry, there was an error uploading your file.";
	    }
  
}else{
	echo "Sorry, there was an error uploading your file.";
}


?>

สร้าง Classs ResizeImage สำหรับ Resize File ที่เรา Upload ให้มีขนาดเล็กลงตามที่เรากำหนดครับ

รายละเอียดเพิ่มเติม Resize Image Class With PHP

<?php
/**
 * Resize image class will allow you to resize an image
 *
 * Can resize to exact size
 * Max width size while keep aspect ratio
 * Max height size while keep aspect ratio
 * Automatic while keep aspect ratio
 */
class ResizeImage
{
	private $ext;
	private $image;
	private $newImage;
	private $origWidth;
	private $origHeight;
	private $resizeWidth;
	private $resizeHeight;
	/**
	 * Class constructor requires to send through the image filename
	 *
	 * @param string $filename - Filename of the image you want to resize
	 */
	public function __construct( $filename )
	{
		if(file_exists($filename))
		{
			$this->setImage( $filename );
		} else {
			throw new Exception('Image ' . $filename . ' can not be found, try another image.');
		}
	}
	/**
	 * Set the image variable by using image create
	 *
	 * @param string $filename - The image filename
	 */
	private function setImage( $filename )
	{
		$size = getimagesize($filename);
		$this->ext = $size['mime'];
		switch($this->ext)
	    {
	    	// Image is a JPG
	        case 'image/jpg':
	        case 'image/jpeg':
	        	// create a jpeg extension
	            $this->image = imagecreatefromjpeg($filename);
	            break;
	        // Image is a GIF
	        case 'image/gif':
	            $this->image = @imagecreatefromgif($filename);
	            break;
	        // Image is a PNG
	        case 'image/png':
	            $this->image = @imagecreatefrompng($filename);
	            break;
	        // Mime type not found
	        default:
	            throw new Exception("File is not an image, please use another file type.", 1);
	    }
	    $this->origWidth = imagesx($this->image);
	    $this->origHeight = imagesy($this->image);
	}
	/**
	 * Save the image as the image type the original image was
	 *
	 * @param  String[type] $savePath     - The path to store the new image
	 * @param  string $imageQuality 	  - The qulaity level of image to create
	 *
	 * @return Saves the image
	 */
	public function saveImage($savePath, $imageQuality="100", $download = false)
	{
	    switch($this->ext)
	    {
	        case 'image/jpg':
	        case 'image/jpeg':
	        	// Check PHP supports this file type
	            if (imagetypes() & IMG_JPG) {
	                imagejpeg($this->newImage, $savePath, $imageQuality);
	            }
	            break;
	        case 'image/gif':
	        	// Check PHP supports this file type
	            if (imagetypes() & IMG_GIF) {
	                imagegif($this->newImage, $savePath);
	            }
	            break;
	        case 'image/png':
	            $invertScaleQuality = 9 - round(($imageQuality/100) * 9);
	            // Check PHP supports this file type
	            if (imagetypes() & IMG_PNG) {
	                imagepng($this->newImage, $savePath, $invertScaleQuality);
	            }
	            break;
	    }
	    if($download)
	    {
	    	header('Content-Description: File Transfer');
			header("Content-type: application/octet-stream");
			header("Content-disposition: attachment; filename= ".$savePath."");
			readfile($savePath);
	    }
	    imagedestroy($this->newImage);
	}
	/**
	 * Resize the image to these set dimensions
	 *
	 * @param  int $width        	- Max width of the image
	 * @param  int $height       	- Max height of the image
	 * @param  string $resizeOption - Scale option for the image
	 *
	 * @return Save new image
	 */
	public function resizeTo( $width, $height, $resizeOption = 'default' )
	{
		switch(strtolower($resizeOption))
		{
			case 'exact':
				$this->resizeWidth = $width;
				$this->resizeHeight = $height;
			break;
			case 'maxwidth':
				$this->resizeWidth  = $width;
				$this->resizeHeight = $this->resizeHeightByWidth($width);
			break;
			case 'maxheight':
				$this->resizeWidth  = $this->resizeWidthByHeight($height);
				$this->resizeHeight = $height;
			break;
			default:
				if($this->origWidth > $width || $this->origHeight > $height)
				{
					if ( $this->origWidth > $this->origHeight ) {
				    	 $this->resizeHeight = $this->resizeHeightByWidth($width);
			  			 $this->resizeWidth  = $width;
					} else if( $this->origWidth < $this->origHeight ) {
						$this->resizeWidth  = $this->resizeWidthByHeight($height);
						$this->resizeHeight = $height;
					}
				} else {
		            $this->resizeWidth = $width;
		            $this->resizeHeight = $height;
		        }
			break;
		}
		$this->newImage = imagecreatetruecolor($this->resizeWidth, $this->resizeHeight);
    	imagecopyresampled($this->newImage, $this->image, 0, 0, 0, 0, $this->resizeWidth, $this->resizeHeight, $this->origWidth, $this->origHeight);
	}
	/**
	 * Get the resized height from the width keeping the aspect ratio
	 *
	 * @param  int $width - Max image width
	 *
	 * @return Height keeping aspect ratio
	 */
	private function resizeHeightByWidth($width)
	{
		return floor(($this->origHeight/$this->origWidth)*$width);
	}
	/**
	 * Get the resized width from the height keeping the aspect ratio
	 *
	 * @param  int $height - Max image height
	 *
	 * @return Width keeping aspect ratio
	 */
	private function resizeWidthByHeight($height)
	{
		return floor(($this->origWidth/$this->origHeight)*$height);
	}
}
?>

ทดสอบการทำงาน

เมื่อ Upload Image แล้ว หากไม่มีอะไรผิดพลาด ใน Folder uploads จะมีไฟล์ที่เรา Upload และ ไฟล์ที่ถูก Resize แล้วดังภาพ

 

ข้อขอบคุณข้อมูลจาก

https://www.w3schools.com/php/php_file_upload.asp

https://dzone.com/articles/resize-image-class-php


Deprecated: Function create_function() is deprecated in /home/service1/domains/monkeywebstudio.com/public_html/wp-content/plugins/simple-lightbox/controller.php on line 1642