サンプル・プログラム
サンプル・プログラムの解説:準備
10: $path_up = "./upload/"; //アップロード用パス
46: if (isset($_FILES["upload"]) == FALSE) {
サンプル・プログラムの解説:アップロード・ファイル指定
あとは、POST メソッドでファイルがアップロードされる。
49: <form name="add" enctype="multipart/form-data" method="post" action="$myself">
50: ファイル:
51: <input name="upload" type="file" size="50" />
52: <input value="登録" type="submit" />
53: </form>
58: $filenames = array();
59: $n = get_filenames($path_up, $filenames);
60: if ($n == 0) {
61: echo "<<ファイルは登録されていません>>";
62: } else {
63: echo "<table border=\"0\">\n";
64: echo "<caption>登録ファイル一覧</caption>\n";
65: foreach($filenames as $key=>$val) {
66: echo "<tr>\n";
67: echo "<td><a href=\"" . $path_up . $val . "\" target=\"_blank\">$val</a></td>\n";
68: echo "</tr>\n";
69: }
70: echo "</table>\n";
71: }
変数 $path_up にあるファイル名一覧を取得するユーザー関数 get_filenames を用意した。
取得したファイル名は、配列変数 $filenames に代入する。引き数に & を付けると、参照による代入を行うことを意味する。
PHP では、ディレクトリを扱うための opendir 関数が用意されている。これを fopen 関数のように使い、個々のファイル名を readdir 関数で読み出していくことができる。
isdir 関数を使い、取得したファイル名がディレクトリか判断する。ファイル名がディレクトリであれば、配列には格納しない。
14: /**
15: * 指定パスのファイル名一覧を取得する
16: * @param string $path ターゲット・パス
17: * @param array $filenames ファイル名を格納する配列
18: * @return int 取得したファイル数
19: */
20: function get_filenames($path, &$filenames) {
21: $n = 0;
22: if ($dir = opendir($path)) {
23: while ($fname = readdir($dir)) {
24: if (is_dir($path . $fname)) continue;
25: $filenames[$n] = $fname;
26: $n++;
27: }
28: }
29: return $n;
30: }
サンプル・プログラムの解説:ファイル登録実行
アップロードした元ファイル名が $_FILES["upload"]["name"] に代入されているので(元のパス名は含まれない)、これが空でないかどうかをチェックする。空でなければ、登録先のフルネームを変数 $file_name に代入する。
もし $file_name が存在していたら、登録処理は中止する。
アップロードされたファイルそのものは、一時ファイル $_FILES["upload"]["tmp_name"] に格納されている。これを $file_name へコピーしてやる。
79: if (! empty($_FILES["upload"]["name"])) {
80: $file_name = $path_up . $_FILES["upload"]["name"];
81: if (! file_exists($file_name)) {
82: $ret = copy($_FILES["upload"]["tmp_name"], $file_name);
83: echo "> " . $_FILES["upload"]["name"];
84: if ($ret) echo " の登録に成功<br />\n";
85: else echo " の登録に失敗<br />\n";
86: } else {
87: echo "> 同名ファイルが存在するため登録中止<br />\n";
88: }
89: }
92: <form method="post" action="$myself">
93: <input type="submit" value="戻る" />
94: </form>
この部分は OS のファイルシステムに依存することがあるようだ。一般的には Shift JIS 指定でよいだろう。
Windows では、UTF-16 や UTF-32 でも正常に動作するが、UTF-8 では動作しなかった。
12: mb_internal_encoding('SJIS');