簡易アップローダー
Category
PHP
知人とそこそこ大きいサイズのデータをやり取りする際、宅ファイル便を使用していましたが、相手側がアカウントを作成していないとちょっと手間なので、簡易アップローダーを作ってみました(PHPで簡単に作れるタイプのものですが...)。
機能的には、極力シンプルなもので、自分のサーバーに置けるといったものです。
▼機能はこんな感じ
・アップロードサイズの上限を設定できる
・アップロードしたファイル名・サイズ・形式の判定
・既にアップロードされているファイルが同名の場合は上書きしない
※ファイルの削除機能は入れていません(自分のサーバーですし)。
※認証機能は入れていません(認証方法は他にもいろいろありますので)。
Keyword:アップローダー,PHP
ディレクトリ構成
補足
●common.css
ブラウザ表示でのレイアウト調整用のCSS。
●ie9.js
IE8以前でもCSS3を使用するため、ie9.jsを使用。
※テーブルタグで使用するスタイルにCSS3を使っています。
ie9.jsとテーブルタグ用CSS3に関しては、以下の記事でも紹介しています。
⇒ 「HTML5.jsとIE9.js」
⇒ 「CSSでテーブルタグ(table・th・tr・td)を扱いやすくする」
●upload
このフォルダの中に、アップロードしたファイルが格納されます。
●index.html
アップロード画面用のHTML
●uploader.php
アップローダー作成用のPHPスクリプト
では、それぞれのソースを紹介します。
ie9.jsは、ダウンロードして読み込むだけですので省略します。
上記の記事で詳細をご覧ください。
参考ソース
common.css
@charset "utf-8"; /* フォント */ body { font-size: 13px; line-height: 22px; color:#484848; font-family: "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, sans-serif; letter-spacing: 0.1em; text-align: left; } /* ファイル選択 */ .file_select input { width: 300px; margin: 0px 0px 10px 0px; padding: 3px; font-size: 12px; color:#484848; font-family: "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, sans-serif; background-color: #ffffff; border: solid 1px #999999; } /* チェックボックス */ .checkbox input { margin: 0px 0px 10px 0px; } /* アップロードボタン */ .upload input { margin: 0px; padding: 5px 20px; font-size: 12px; color:#484848; font-family: "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, sans-serif; background-color: #f0f0f0; border: solid 1px #999999; } /* 結果表示のタイトル */ h1 { font-size: 13px; font-weight: bold; margin: 0px 0px 10px 0px; } /* 警告時のテキストカラー */ .attention { color:#ff0000; } /* table幅(隣接するセルのボーダーを重ねて表示) */ table.tb_style { width: 450px; border-collapse: collapse; } /* tr */ table.tb_style tr { padding: 5px; background-color: #FFFFFF; } /* 1行目のtr */ table.tb_style tr:nth-child(1) { padding: 5px; background-color: #f0f0f0; text-align: center; } /* td */ table.tb_style td { width: 150px; padding: 5px; border:1px solid #999999; }
補足
●フォント
bodyタグにフォント表示用のスタイルを記述。
●ファイル選択
アップローダーでファイルをアップロードする際のファイル選択用のスタイルを記述。
●チェックボックス
“既にアップロードされているファイルが同名の場合は上書きしない”のチェックボックス用のスタイルを記述。
●アップロードボタン
アップロードボタン用のスタイルを記述。
●結果表示のタイトル
結果表示のタイトル用のスタイルを記述。
●警告時のテキストカラー
エラー出力時のテキストカラー用のスタイルを記述。
●table幅(隣接するセルのボーダーを重ねて表示)
table用のスタイルを記述。
●tr
tr用のスタイルを記述。
●1行目のtr
1行目のtrのみ、背景色とテキスト揃えを変更。
“nth-child(1)”は、CSS3の擬似クラスです。
●td
tdのスタイルを記述。
index.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" href="css/common.css"> <script src="js/ie9.js"></script> </head> <body> <form method="post" action="uploader.php" enctype="multipart/form-data"> <p class="file_select"> <!--アップロードサイズの上限:100MB--> <input type="hidden" name="max_file_size" value="100000000"> ▼ファイルを選択してください(※上限100MBまで)<br> <input name="upfile[]" type="file"><br> <input name="upfile[]" type="file"><br> <input name="upfile[]" type="file"><br> <input name="upfile[]" type="file"><br> <input name="upfile[]" type="file"> </p> <p class="checkbox"><input type="checkbox" name="unoverwrite" value="true" checked>同名ファイルを上書きしない</p> <p class="upload"><input type="submit" value="アップロード"></p> </form> </body> </html>
補足
5行目の”<title></title>”には、ページタイトルを記述してください。
10行目の”action=”uploader.php””には、PHPスクリプトのファイル名を記述します。
13行目でアップロードサイズの上限を指定します。
参考ソースでは、5つまでファイルをアップロード可能です。
19行目以下に続けることで、アップロードできるファイル数を増やせます。
21行目は、”同名ファイルを上書きしない”にチェックが入っている場合、サーバー上に既にアップロードされているファイルの名前が同じ際にはエラーを出力し、上書きアップロードされません。
uploader.php
<?php // アップロードディレクトリを指定 $updir = "./upload/"; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" href="css/common.css"> <script src="js/ie9.js"></script> </head> <body> <h1>▼アップロード結果</h1> <table class="tb_style"> <tr> <td>ファイル名</td> <td>サイズ</td> <td>タイプ</td> </tr> <?php for($i=0;$i<sizeof($_FILES['upfile']['name']);$i++) { if($_FILES['upfile']['name'][$i]=="") continue; if(file_exists($updir.mb_convert_encoding($_FILES['upfile']['name'][$i],"utf-8","utf-8"))==TRUE && $_POST['unoverwrite']=="true") { ?> <tr> <td><?php print($_FILES['upfile']['name'][$i]); ?></td> <td colspan="2"><span class="attention">上書き禁止設定になっています。<br>もう一度アップロードし直してください。<br>※ブラウザの[戻る(←)]ボタンよりアップロード画面に移動。</span></td> </tr> <?php } elseif(!is_uploaded_file($_FILES['upfile']['tmp_name'][$i])) { ?> <tr> <td><?php print($_FILES['upfile']['name'][$i]); ?></td> <td colspan="2"><span class="attention">アップロードに失敗しました。<br>サイズの上限を超えていませんか?<br>もう一度アップロードし直してください。<br>※ブラウザの[戻る(←)]ボタンよりアップロード画面に移動。</span></td> </tr> <?php } else { ?> <tr> <td><?php print($_FILES['upfile']['name'][$i]); ?></td> <td><?php print($_FILES['upfile']['size'][$i]); ?>Byte</td> <td><?php print($_FILES['upfile']['type'][$i]); ?></td> </tr> <?php move_uploaded_file($_FILES['upfile']['tmp_name'][$i],$updir.mb_convert_encoding($_FILES['upfile']['name'][$i],"utf-8","utf-8")); } } ?> </table> </body> </html>
補足
4行目でアップロードしたファイルが格納されるディレクトリを指定します。
相対パスで指定してください(※参考ソースでは、uploader.phpからみて、同一階層にあるuploadディレクトリを指定しています)。
設定は以上です。
あとは、今回作成したファイルをサーバーにアップロードすればOK!
“ディレクトリ構成”で説明したファイルとフォルダを”uploader”等のフォルダを作って全てその中に入れ、その”uploader”フォルダごとアップロードしましょう。
アップロードしたファイルが格納されるuploadディレクトリのパーミッションは、777や707にしてくださいね。
“uploader”ディレクトリに入れるのは、このディレクトリのみ認証を効かすためです。
最後に、画面の表示イメージと注意事項を載せておきます。
ファイル選択・アップロード画面
アップロード結果画面
エラー画面(同名ファイルは上書き禁止)
エラー画面(アップロードサイズの上限越え)
注意事項としては、このままだとURLが分っている人は誰でもアクセスできてしまうので、認証を入れるようにしましょう。
簡単に認証をかけたい場合は、Basic認証かDigest認証。
共に、SSLをかけた方がもちろん安全です。
SSLが無理な場合(環境的に等)、Basic認証よりはDigest認証の方がよいですね。
Basic認証は、パスワードが暗号化されませんので、パケットを傍受されるとパスワードが分ってしまいます。
Digest認証は、パスワードがMD5ハッシュで暗号化されていますので、そう簡単にはパスワードは分りません。
理想的には、SSL+Basic認証 or Digest認証ですね。
Digest認証に関しては、「APCでPHPの処理を高速化」の中でも紹介しています。
よかったらご覧ください。
関連記事(※当記事と関連性が高いと思われる記事)
CSSでテーブルタグ(table・th・tr・td)を扱いやすくする
2012/08/22
HTML5のバリデータチェック時に覚えておきたいこと
2012/03/25
フォームで郵便番号から住所を自動入力させる
2012/02/26
HTML5のplaceholder属性をInternet Explorerで使う
2012/05/01
印刷対応サイト
2012/08/31
おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)