画像ファイルアッププログラム
簡単な画像ファイルアッププログラム。
index.php
<?php ini_set('display_errors', 1); define('MAX_FILE_SIZE', 1 * 1024 * 1024); // 1MB define('THUMBNAIL_WIDTH', 400); define('IMAGES_DIR', __DIR__ . '/images'); define('THUMBNAIL_DIR', __DIR__ . '/thumbs'); if (!function_exists('imagecreatetruecolor')) { echo 'GD not installed'; exit; } function h($s) { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); } require 'ImageUploader.php'; $uploader = new \MyApp\ImageUploader(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $uploader->upload(); } $images = $uploader->getImages(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Image Uploader</title> <style> body { text-align: center; font-family: Arial, sans-serif; } ul { list-style: none; margin: 0; padding: 0; } li { margin-bottom: 5px; } </style> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo h(MAX_FILE_SIZE); ?>"> <input type="file" name="image"> <input type="submit" value="upload"> </form> <ul> <?php foreach ($images as $image) : ?> <li> <a href="<?php echo h(basename(IMAGES_DIR)) . '/' . basename($image); ?>"> <img src="<?php echo h($image); ?>"> </a> </li> <?php endforeach; ?> </ul> </body> </html>
ImageUploader.php
<?php namespace MyApp; class ImageUploader { private $_imageFileName; private $_imageType; public function upload() { try { // error check $this->_validateUpload(); // type check $ext = $this->_validateImageType(); // var_dump($ext); // exit; // save $savePath = $this->_save($ext); // create thumbnail $this->_createThumbnail($savePath); } catch (\Exception $e) { echo $e->getMessage(); exit; } // redirect header('Location: http://' . $_SERVER['HTTP_HOST']); exit; } public function getImages() { $images = []; $files = []; $imageDir = opendir(IMAGES_DIR); while (false !== ($file = readdir($imageDir))) { if ($file === '.' || $file === '..') { continue; } $files[] = $file; if (file_exists(THUMBNAIL_DIR . '/' . $file)) { $images[] = basename(THUMBNAIL_DIR) . '/' . $file; } else { $images[] = basename(IMAGES_DIR) . '/' . $file; } } array_multisort($files, SORT_DESC, $images); return $images; } private function _createThumbnail($savePath) { $imageSize = getimagesize($savePath); $width = $imageSize[0]; $height = $imageSize[1]; if ($width > THUMBNAIL_WIDTH) { $this->_createThumbnailMain($savePath, $width, $height); } } private function _createThumbnailMain($savePath, $width, $height) { switch($this->_imageType) { case IMAGETYPE_GIF: $srcImage = imagecreatefromgif($savePath); break; case IMAGETYPE_JPEG: $srcImage = imagecreatefromjpeg($savePath); break; case IMAGETYPE_PNG: $srcImage = imagecreatefrompng($savePath); break; } $thumbHeight = round($height * THUMBNAIL_WIDTH / $width); $thumbImage = imagecreatetruecolor(THUMBNAIL_WIDTH, $thumbHeight); imagecopyresampled($thumbImage, $srcImage, 0, 0, 0, 0, THUMBNAIL_WIDTH, $thumbHeight, $width, $height); switch($this->_imageType) { case IMAGETYPE_GIF: imagegif($thumbImage, THUMBNAIL_DIR . '/' . $this->_imageFileName); break; case IMAGETYPE_JPEG: imagejpeg($thumbImage, THUMBNAIL_DIR . '/' . $this->_imageFileName); break; case IMAGETYPE_PNG: imagepng($thumbImage, THUMBNAIL_DIR . '/' . $this->_imageFileName); break; } } private function _save($ext) { $this->_imageFileName = sprintf( '%s_%s.%s', time(), sha1(uniqid(mt_rand(), true)), $ext ); $savePath = IMAGES_DIR . '/' . $this->_imageFileName; $res = move_uploaded_file($_FILES['image']['tmp_name'], $savePath); if ($res === false) { throw new \Exception('Could not upload!'); } return $savePath; } private function _validateImageType() { $this->_imageType = exif_imagetype($_FILES['image']['tmp_name']); switch($this->_imageType) { case IMAGETYPE_GIF: return 'gif'; case IMAGETYPE_JPEG: return 'jpg'; case IMAGETYPE_PNG: return 'png'; default: throw new \Exception('PNG/JPEG/GIF only!'); } } private function _validateUpload() { // var_dump($_FILES); // exit; if (!isset($_FILES['image']) || !isset($_FILES['image']['error'])) { throw new \Exception('Upload Error!'); } switch($_FILES['image']['error']) { case UPLOAD_ERR_OK: return true; case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new \Exception('File too large!'); default: throw new \Exception('Err: ' . $_FILES['image']['error']); } } }