
<?php
if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])){
// 各ファイルをチェック
foreach ($_FILES['upfile']['error'] as $k => $error){
try {
if (!is_int($error)){
throw new RuntimeException("[{$k}] パラメータが不正です");
}
// $_FILES['upfile']['error']の値を確認
switch ($_FILES['upfile']['error']){
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:
throw new RuntimeException('ファイルが選択されていません');
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
throw new RuntimeException('ファイルサイズが大きすぎます');
default:
throw new RuntimeException('その他のエラーが発生しました');
}
// $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので
// MIMEタイプを自前でチェックする
if (!$info @getimagesize($_FILES['upfile']['tmp_name'][$k])){
throw new RuntimeException("[{$k}] 有効な画像ファイルを指定してください");
}
if (!in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)){
throw new RuntimeException("[{$k}] 未対応の画像形式です");
}
// 画像処理に使う関数名を決定する
$create = str_replace('/', 'createfrom', $info['mime']);
$output = str_replace('/', '', $info['mime']);
// 縦横比を維持したまま、120*120 以下に収まるサイズを求める
if ($info[0] >= $info[1]){
$dst_w = 120;
$dst_h = ceil(120 * $info[1] / max($info[0], 1));
} else {
$dst_w = ceil(120 * $info[0] / max($info[1], 1));
$dst_h = 120;
}
// 元画像リソースの生成を試みる
if (!$src = @$create($_FILES['upfile']['tmp_name'][$k])){
throw new RuntimeException("[{$k}] 画像リソースの生成に失敗しました");
}
// リサンプリング先画像リソースを生成する
$dst = imagecreatetruecolor($dst_w, $dst_h);
// getimagesize関数で得られた情報も利用してリサンプリングを行う
imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]);
// ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、保存する
if (!$output(
$dst,
sprintf('./resized/%s%s',
sha1_file($_FILES['upfile']['tmp_name'][$k]),
image_type_to_extension($info[2])
)
)) {
throw new RuntimeException("[{$k}] ファイル保存時にエラーが発生しました");
}
$msgs[] = ['green', "[{$k}] リサイズして保存しました"];
} catch (RuntimeException $e){
$msgs = ['red', $e->getMessage()];
}
if (isset($img) && is_resource($img)){
imagedestroy($img);
}
if (isset($dst) && is_resource($dst)){
imagedestroy($dst);
}
}
}
// XTHMLとしてブラウザに認識させる
// (IE8以外はサポート対象外)
header('Content-Type: application/xhtml+xml; charset=utf-8');
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>画像アップロード</title>
</head>
<body>
<?php if (!empty($msgs)): ?>
<ul>
<?php foreach ($msgs as $msg): ?>
<li style="color:<?=$msg[0]?>;"><?=
htmlspecialchars($msg[1], ENT_QUOTES, 'UTF-8')
?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form enctype="multipart/form-data" method="post" action="">
<fieldset>
<legend>画像ファイルを選択(GIF, JPEG, PNGのみ対応)</legend>
<ul>
<?php for ($i = 0; $i < 10; $i++): ?>
<li><input type="file" name="upfile[]" /></li>
<?php endfor; ?>
</ul>
<input type="submit" value="送信" />
</fieldset>
</form>
</body>
</html>