ドットインストールで画像掲示板の解説があり、打ち込んでみました。
確認ページ:index.php
メモ
- formにenctype=”multipart/form-data”が必要
- $_SERVER['SCRIPT_FILENAME']は動作中スクリプトのパス
- dirname($_SERVER['SCRIPT_FILENAME'])は動作中スクリプトの親パス
- GDというのでサムネイル画像をつくれる
- アップロードしたファイルは$_FILES['input:fileのname']['tmp_name']に格納される
- move_uploaded_file()でアップロードしたファイルを移動させる
- アップロード結果は$_FILES['input:fileのname']['error']に格納される
- アップロード結果のエラーコード一覧
GD有効かの判定
if (!function_exists('imagecreatetruecolor')) { echo "GDがインストールされていません"; exit; }
$_FILES['input:fileのname']のvar_dump
array(5) { ["name"]=> string(17) "wallpaper_001.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(18) "/var/tmp/phpiVgT6y" ["error"]=> int(0) ["size"]=> int(57418) }
getimagesize($_FILES['input:fileのname']['tmp_name'])のvar_dump
array(6) { [0]=> int(1280) [1]=> int(1024) [2]=> int(3) [3]=> string(26) "width="1280" height="1024"" ["bits"]=> int(8) ["mime"]=> string(9) "image/png" }
ファイルサイズ取得と範囲チェック
$size = filesize($_FILES['input:fileのname']['tmp_name']); if (!$size || $size > MAX_FILE_SIZE) { echo 'filesize invalid: 0 or too big'; exit; }
ソースコード
index.php
<?php require_once('config.php'); $files = glob(IMAGES_DIR.'/*'); $images = array(); foreach ($files as $file) { if (file_exists(THUMBNAIL_DIR.'/'.basename($file))) { $images[] = 'thumbnails/'.basename($file); } else { $images[] = 'images/'.basename($file); } } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title>画像掲示板</title> </head> <body> <form method="post" action="upload.php" enctype="multipart/form-data"> <input id="image" name="image" type="file" /> <input type="submit" value="upload" /> </form> <hr> <?php foreach ($images as $image): ?> <?php if (strpos($image, 'thumbnails/') === 0): ?> <a href="./images/<?php echo basename($image); ?>"><img src="<?php echo $image; ?>"</a> <?php else: ?> <img src="<?php echo $image; ?>"> <?php endif; ?> <?php endforeach; ?> </body> </html>
upload.php
require_once('config.php'); if ($_FILES['image']['error'] != UPLOAD_ERR_OK) { echo 'error occured:'.$_FILES['image']['error']; exit; } $size = filesize($_FILES['image']['tmp_name']); if (!$size || $size > MAX_FILE_SIZE) { echo 'filesize invalid: 0 or too big'; exit; } $imagesize = getimagesize($_FILES['image']['tmp_name']); switch ($imagesize['mime']) { case 'image/gif': $ext = '.gif'; break; case 'image/jpeg': $ext = '.jpg'; break; case 'image/png': $ext = '.png'; break; default: echo 'gif/jpeg/png only'; exit; } $imageFileName = sha1(time().mt_rand()) . $ext; $imageFilePath = IMAGES_DIR . '/' . $imageFileName; $rs = move_uploaded_file($_FILES['image']['tmp_name'], $imageFilePath); if (!$rs) { echo "could not upload"; exit; } $width = $imagesize[0]; $height = $imagesize[1]; if ($width > THUMBNAIL_WIDTH) { switch ($imagesize['mime']) { case 'image/gif': $srcImage = imagecreatefromgif($imageFilePath); break; case 'image/jpeg': $srcImage = imagecreatefromjpeg($imageFilePath); break; case 'image/png': $srcImage = imagecreatefrompng($imageFilePath); break; } $thumbHeight = round($height * THUMBNAIL_WIDTH / $width); $thumbImage = imagecreatetruecolor(THUMBNAIL_WIDTH, $thumbHeight); imagecopyresampled($thumbImage, $srcImage, 0, 0, 0, 0, 72, $thumbHeight, $width, $height); switch ($imagesize['mime']) { case 'image/gif': imagegif($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName); break; case 'image/jpeg': imagejpeg($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName); break; case 'image/png': imagepng($thmubImage, THUMBNAIL_DIR.'/'.$imageFileName); break; } } header('Location: http://' . $_SERVER['SERVER_NAME'] . '/study/uploader/upload_image_php/index.php'); exit;
config.php
define('IMAGES_DIR', dirname($_SERVER['SCRIPT_FILENAME']).'/images'); define('THUMBNAIL_DIR', dirname($_SERVER['SCRIPT_FILENAME']).'/thumbnails'); define('THUMBNAIL_WIDTH', 72); define('MAX_FILE_SIZE', 307200); // 300KB error_reporting(E_ALL & ~E_NOTICE); if (!function_exists('imagecreatetruecolor')) { echo "GDがインストールされていません"; exit; }
参考サイト
関連エントリー