php
1// ここで $tmp_name に代入されている値を確認しましょう
2var_dump($tmp_name);
3
4if (!preg_match('/\.jpg$|\.jpeg$/i', $tmp_name)) {
5 echo "";
6} else {
7 echo '<FONT COLOR="RED">JPEGファイルを選択してください!</FONT>';
8}
そもそも $tmp_name には拡張子に当たる文字列は存在しない。
preg_match でファイルタイプを判定することがバッドノウハウです。
finfo_file で判定しましょう。
#サンプルコード
html
1<?php
2ini_set('display_errors', true);
3error_reporting(E_ALL);
4
5define('UP_DIR', 'updir');
6
7function h($string)
8{
9 return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
10}
11
12/**
13 * ファイルアップロードエラーを判定する
14 * @param type $upfile
15 * @return bool
16 * @throws Exception
17 */
18function check_error($upfile)
19{
20 switch ($upfile['error']) {
21 case UPLOAD_ERR_OK:
22 return true;
23 case UPLOAD_ERR_INI_SIZE:
24 $err = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。';
25 break;
26 case UPLOAD_ERR_FORM_SIZE:
27 $err = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。';
28 break;
29 case UPLOAD_ERR_PARTIAL:
30 $err = 'アップロードされたファイルは一部のみしかアップロードされていません。';
31 break;
32 case UPLOAD_ERR_NO_FILE:
33 $err = 'ファイルはアップロードされませんでした。';
34 break;
35 case UPLOAD_ERR_NO_TMP_DIR:
36 $err = 'テンポラリフォルダがありません。';
37 break;
38 case UPLOAD_ERR_CANT_WRITE:
39 $err = 'ディスクへの書き込みに失敗しました。';
40 break;
41 case UPLOAD_ERR_EXTENSION:
42 $err = 'PHP の拡張モジュールがファイルのアップロードを中止しました。';
43 break;
44 }
45
46 if (!empty($err)) {
47 throw new Exception($err);
48 }
49}
50
51/**
52 * ファイルタイプをチェックし、拡張子を返す
53 * @param type $upfile
54 * @return bool
55 */
56function check_extension($upfile)
57{
58 $arr_accept_mimes = [
59 'jpg' => 'image/jpeg'
60 , 'png' => 'image/png'
61 , 'gif' => 'image/gif'
62 ];
63
64 $finfo = finfo_open(FILEINFO_MIME_TYPE);
65 $mime_type = finfo_file($finfo, $upfile['tmp_name']);
66
67 if (in_array($mime_type, $arr_accept_mimes)) {
68 return array_search($mime_type, $arr_accept_mimes);
69 }
70
71 $msg = '許可されていないファイルタイプです。';
72 throw new Exception($msg);
73}
74
75if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') {
76
77 try {
78
79 $upfile = $_FILES['upfile'];
80
81 // エラーチェック
82 check_error($upfile);
83
84 // ファイルタイプチェック
85 $extension = check_extension($upfile);
86
87 $tmp_name = $upfile['tmp_name'];
88
89 // ファイル保存先 + ファイル名
90 $base_name = sha1_file($tmp_name) . '.' . $extension;
91
92 if (!file_exists(UP_DIR)) {
93 $msg = sprintf('%s ディレクトリが存在しません。', UP_DIR);
94 throw new Exception($msg);
95 }
96 if (!is_writable(UP_DIR)) {
97 $msg = sprintf('%s に書き込み権限がありません。', UP_DIR);
98 throw new Exception($msg);
99 }
100
101 $destination = UP_DIR . DIRECTORY_SEPARATOR . $base_name;
102 if (file_exists($destination)) {
103 $msg = sprintf('同一のファイルがすでにアップロードされています。', UP_DIR);
104 throw new Exception($msg);
105 }
106
107 move_uploaded_file($tmp_name, $destination);
108 } catch (Exception $e) {
109 $err = $e->getMessage();
110 }
111}
112?><!DOCTYPE HTML>
113<html lang="ja">
114 <head>
115 <meta charset="UTF-8">
116 <title></title>
117 <style type="text/css">
118 .error {
119 color: red;
120 }
121 </style>
122 </head>
123 <body>
124 <form action="" enctype="multipart/form-data" method="post">
125 <?php if (isset($err)) : ?>
126 <p class="error">エラー: <?= h($err); ?></p>
127 <?php endif; ?>
128
129 <p>
130 <label for="upfile">画像ファイル</label>
131 <input type="file" name="upfile" id="upfile" />
132 </p>
133 <p>
134 <button type="submit">アップロード</button>
135 </p>
136 </form>
137 </body>
138</html>
#おまけ
このサンプルコードを書く様子を動画でキャプチャしてみました。
三流プログラマのもので申し訳ないが、デバッグの様子など見ると参考になるかも。
https://www.youtube.com/watch?v=PEDERfokvPU
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。