画像アップローダー(PHP)

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

参考サイト

関連エントリー

  1. PHPでフォームの値をMySQLデータベースに格納する
  2. アップローダ(PHP)続き
  3. PHPでWordPressに投稿する
  4. PhoneGapお試し(iOS)
  5. jQuery.ajaxでPHPプログラムに処理要求を出したい
This entry was posted in 未分類 and tagged . Bookmark the permalink.