phpな休日 BBS sitemap
1. ファイル(JPEG画像)のアップロード

画像(JPEG)のアップロードは [25. 絵日記] のところでやりましたが、掲示板や日記スクリプトを作る場合(自動で)サムネイルの作成をしたくなります、と言うことで。
まずは入力フォームを作ります。

<form action="" method="POST" enctype="multipart/form-data">
<input type="file" size="50" name="jpeg"><br>   <input type="submit" value="送信">
</form>

実行

ファイルアップロードの処理は、条件をつけなければ簡単なのですが (入力FORMがname="jpeg" の場合)

$image = "./image/image.jpg"; //アップロード場所とファイル名
move_uploaded_file($_FILES["jpeg"]["tmp_name"], $image); //アップロード

(上記の場合、ファイルをアップロードするディレクトリ [image] は “書き込み許可属性” が必要になります。)

無条件でアップロードしたのではあまりに危険なので、いくつか条件を付加します。

<?php
if ($_FILES["jpeg"]["tmp_name"] != "") { //画像送信しようとした場合
if($_FILES["jpeg"]["type"] != "image/pjpeg" && $_FILES["jpeg"]["type"] != "image/jpeg"){ //JPEGファイルではない
header("Location: ./index.php"); //index.phpを呼び出して
exit; //終了する
}
elseif($_FILES["jpeg"]["size"] > 2048*1024){ //ファイルサイズが2MB以上
header("Location: ./index.php"); //index.phpを呼び出して
exit; //終了する
}
elseif(!is_uploaded_file($_FILES["jpeg"]["tmp_name"])){ //フォームからの送信でない
header("Location: ./index.php"); //index.phpを呼び出して
exit; //終了する
}
else {
$image = "./image/image.jpg";
$thumb = "./thumb/thumb.jpg";
move_uploaded_file($_FILES["jpeg"]["tmp_name"], $image); //アップロード
}
}
?>
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" size="50" name="jpeg">
<input type="submit" value="submit">
</form>

(えーと、それでも2MBをアップロードされても困るのでサンプルはありません。)

2. GD2を使って画像のサムネイルを作成する。

処理の流れをイメージした図です。

サムネイルを作成するためにアップロードされた画像のサイズを getimagesize で取得します。

$Jsize=getimagesize(" ファイル名 ");

というふうにすると、$Jsize[0]に横幅の値、$Jsize[1]に縦の値が入ります。今回は横幅120pxのサムネイルを作成しますので
サムネイルの縦の値は算数で求めます。 縦×120÷横=サムネイルの縦

なお、ここから先の処理にはサーバーの GD2 (グラフィックライブラリ) が有効である必要があります。
[thumb] ディレクトリはサムネイル画像を保存する場所ですので、[image] ディレクトリと同じく “書き込み許可属性” が必要です。
サムネイル作成に必要な部分を赤文字で記します。

<?php
if ($_FILES["jpeg"]["tmp_name"] != "") { //画像送信しようとした場合
if($_FILES["jpeg"]["type"] != "image/pjpeg" && $_FILES["jpeg"]["type"] != "image/jpeg"){ //JPEGファイルではない
header("Location: ./index.php"); //index.phpを呼び出して
exit; //終了する
}
elseif($_FILES["jpeg"]["size"] > 2048*1024){ //ファイルサイズが2MB以上
header("Location: ./index.php"); //index.phpを呼び出して
exit; //終了する
}
elseif(!is_uploaded_file($_FILES["jpeg"]["tmp_name"])){ //フォームからの送信でない
header("Location: ./index.php"); //index.phpを呼び出して
exit; //終了する
}
else {
$image = "./image/image.jpg";
$thumb = "./thumb/thumb.jpg";
move_uploaded_file($_FILES["jpeg"]["tmp_name"], $image); //アップロード
$Jsize=getimagesize("$image"); //画像サイズ取得
if($Jsize[0] >= 121){ //横121ピクセル以上なら
$Jwidth = 120; //横120ピクセル
$Jheight = $Jsize[1] * 120 / $Jsize[0]; //縦サイズを計算
$imagein=imagecreatefromjpeg("$image"); //画像を縮小する
$imageout=imagecreatetruecolor($Jwidth,$Jheight); //サイズ変更(GD2使用)
imagecopyresampled($imageout,$imagein,0,0,0,0,$Jwidth,$Jheight,$Jsize[0],$Jsize[1]);
imagejpeg($imageout,("$thumb")); //サムネイル書き出し
imagedestroy($imagein); //メモリを解放する
imagedestroy($imageout); //メモリを解放する
}
else {//画像の横幅がもともと120ピクセル以下の場合は [thumb] ディレクトリにコピーします。
copy("$image","$thumb"); //ファイルコピー
}
unlink($image); //[image] ディレクトリの画像を削除
}
}
?>
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" size="50" name="jpeg">
<input type="submit" value="submit">
</form>

実行

Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/33/index.cgi:130 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/33/index.cgi on line 130