最近リクエストがあったので、一応メモ。
とはいえ、独自に作成したので無駄も居多いと思いますが、そこは寛大な心で優しく受け止めてください♥
アップロードの要件
構築にあたって、いくつか制限を設けます。
- アップロードできるファイルサイズを10MBまでに制限
- アップロードできるファイルの種類を制限
- ファイル名を削除し年月日にリネームする
コード
ひとまず、コードを記述してみます。
index.html
<form action="up.php" method="post" enctype="multipart/form-data"> <input type="file" name="fname"> <input type="submit" value="アップロード"> </form>
up.php
<?php $tempfile = $_FILES['fname']['tmp_name']; $uploaddir = "./uploads/"; list($file_name,$file_type) = explode(".",$_FILES['fname']['name']); $dateformat=date("Ymd"); $uploadfile = "$uploaddir$dateformat.$file_type"; //拡張子チェック if(preg_match('/\.gif$|\.png$|\.jpg$|\.jpeg$|\.pdf$|\.bmp$/i', $filename)){ $filetype=1;//許可した拡張氏子 }else{ $filetype=2;//許可してない拡張氏子 } //ファイルサイズチェック $size = 1024*1024*10; //10MB上限設定 $filesize = $_FILES["fname"]["size"];//ファイルサイズ取得 ?> <?php if (is_uploaded_file($tempfile)) { if($filesize > $size){ echo "容量オーバー。ファイルをアップロードできません。<br>"; echo "ファイルサイズ" . $filesize_round . "<br>"; } elseif($filetype==2){ echo "拡張子不明。ファイルをアップロードできません。<br>"; } elseif ( move_uploaded_file($tempfile,$uploadfile)) { echo "ファイルをアップロードしました<br>"; } else{ echo "ファイルをアップロードできません。\n"; } } else { echo "ファイルが選択されていません。"; } ?>
HTMLについて
ポイントはenctypeとtype=”file”。enctypeをmultipart/form-dataが必要です。
enctype="multipart/form-data"
またinputのタイプをfileにします。
<input type="file" name="fname">
phpについて
ではphpをみてみます。
POSTで送信されたかチェックする
悪意のあるファイルをアプロードされる可能性もあるので、セキュリティを考慮しアップロードしたファイルを一時的に仮フォルダに保存します。
そのために$tempfileの第2引数にtmp_nameを設定します。
$tempfile = $_FILES['fname']['tmp_name'];
そして、アップロードしたファイルがPOST通信で送信されてきたものかを確認します。
if (is_uploaded_file($tempfile)) {}
問題なければ、本フォルダに保存します。本フォルダはindex.htmlと同じ階層にあるuploadsです。
move_uploaded_file($tempfile , $filename )
ファイルサイズをチェックする。
ここでは1回あたり、10MBまでアップロードOKとします。これは利用しているサーバーのアップロードサイズを事前に確認して設定する必要があります。
php.iniをチェック
確認はphp.iniをチェックします。任意のphpファイルを作成(たとえばinfo.php)し以下のコードを記述して任意の場所にアップします。
<?php phpinfo();?>
アクセスすると、php.iniが表示されすので、以下の関数をチェックしましょう。
memory_limit (メモリ使用量の上限) post_max_size (POSTデータの最大サイズ ※1回のアップロードファイルすべての合計サイズ) upload_max_filesize (1ファイルあたりの最大アップロードサイズ)
または、サーバーの管理ページでもチェックできます。
サイズを制限する
リミットサイズを設定します。
$size = 1024*1024*10;
ファイルサイズを取得します。
$filesize = $_FILES["fname"]["size"];
サイズをチェックし、オーバーならエラーを表示します。
if($filesize > $size){ echo "容量オーバー。ファイルをアップロードできません。<br>"; }
拡張子を制限する
今回アップロードを許可するファイル拡張子は以下です。
gif/png/jpg/pdf/bmp
以下で拡張子を判別します。
if(preg_match('/\.gif$|\.png$|\.jpg$|\.jpeg$|\.pdf$|\.bmp$/i', $filename)){ $filetype=1; }else{ $filetype=2; }
preg_matchでファイルから拡張子を検索し、許可した拡張子なら$filetypeに1を許可してない場合は2を代入します。
以下の条件分岐で2の場合はエラーを表示します。
elseif($filetype==2){ echo "拡張子不明。ファイルをアップロードできません。<br>"; }
ファイル名を年月日にリネームする
アップロードされるファイル名に日本語が含まれてると文字化けの原因になるので、独自のファイル名にリネームする事にします。
ファイル名を取得して拡張子のみ取り出した後、年月日をファイル名にします。
list($file_name,$file_type) = explode(".",$_FILES['fname']['name']); $dateformat=date("Ymd"); $uploadfile = "$uploaddir$dateformat.$file_type"
できる限りユニークにしたい場合はYmdをYmdhisにするとかuniqid関数でユニークコードを使用するのもありですね。
$dateformat=uniqid(date('Ymdhis'));
以上です。
いや〜スキル不足で決して効率的ではないとこもあると思います。
がんばろ。