ドットインストールで画像掲示板の解説があり、打ち込んでみました。
確認ページ: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;
}
参考サイト
関連エントリー