始めに
ネット上に画像をアップロードしたいという必要にかられたのですが、FTPを使ってアップデートをするのは面倒。ZENPhotoなどのような本格的な画像管理CMSの導入までは至らない。しかしかといってCGIを使った既存のアップローダーは投稿件数に制限があったり、10年以上サポートが止っていることなどから自作することにしました。
必要要件は以下の通り。
- 現状において削除はFTPで行っても構わない。
- 画像のみのアップローダーとする
- 大きすぎるファイルは排除する
- アップ後のファイル名は元のファイル名では無くプログラムで決めたファイル名を使う
ご存じの方も多いでしょうが、PHPにはファイルアップロードに関する機能が内蔵されており、比較的容易にフォームからファイルのアップロードを行うことができます。
コード
index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>画像のアップロード</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
ファイル:<br />
<input type="file" name="upfile" size="30" /><br />
<br />
<input type="submit" value="アップロード" />
</form>
</body>
</html>
upload.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>画像のアップロード</title>
</head>
<body>
<p><?php
const FILE_FOL = "files/";
//変数の初期化
$check = null;
$newfilename = null;
$msg = null;
//元ファイル名の先頭にアップロード日時を加える
$ext = pathinfo($_FILES["upfile"]["name"], PATHINFO_EXTENSION);
$newfilename = date("YmdHis").mt_rand().".".$ext;
// ファイルがアップデートされたかを調べる
if(is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
$check = 1;
} else {
$check = 0;
$msg = "ファイルが選択されていません。";
}
if ($check == 1) {
if ($_FILES['upload']['size'] > 1000000) {
$check = 0;
$msg = 'ファイルサイズを小さくしてください';
}
}
//画像か調べる
$file_pass = $_FILES["upfile"]["tmp_name"];
if ($check == 1) {
if(file_exists($file_pass) && $type = exif_imagetype($file_pass)){
switch($type){
//gifの場合
case IMAGETYPE_GIF:
break;
//jpgの場合
case IMAGETYPE_JPEG:
break;
//pngの場合
case IMAGETYPE_PNG:
break;
//どれにも該当しない場合
default:
$msg = "gif、jpg、png以外の画像です";
}
}else{
$msg = "画像ファイルではありません";
$check = 0;
}
}
//例外処理を全てクリアしたらファイルをアップする
if ($check == 1) {
if (move_uploaded_file($file_pass, FILE_FOL.$newfilename)) {
chmod(FILE_FOL. $_FILES["upfile"]["name"], 0644);
print $newfilename. "としてファイルをアップロードしました。<BR>";
print "<a href=".FILE_FOL.$newfilename. ">ファイルを確かめる</A><BR>";
print "<img src=".FILE_FOL.$newfilename." width=400>";
} else {
print "ファイルをアップロードできません。";
}
} else {
print $msg;
}
print "<P><a href=index.html>戻る</A>";
?></p>
</body>
</html>
あとはこの二つを格納したディレクトリの下にFileディレクトリを作成し、FTPソフトなどでパーミッションを 777 に設定すれば完成です。フラグ処理をすることで例外処理の拡張性を増しております。なお、技術的な解説の詳細は最後の参考文献を参照ください。
まとめ
例外処理に躓きもありましたが、簡易的なものであれば殆どPHPの知識が無くても構想を含め2~3時間で完成出来たのには驚きました。これから本格的なものを作成するとなると大変なのも容易に想像が可能でありますが・・・。