回答編集履歴

1

追記

2017/01/17 12:20

投稿

退会済みユーザー
test CHANGED
@@ -27,3 +27,303 @@
27
27
 
28
28
 
29
29
  [finfo_file](http://php.net/manual/ja/function.finfo-file.php) で判定しましょう。
30
+
31
+
32
+
33
+ #サンプルコード
34
+
35
+
36
+
37
+ ```html
38
+
39
+ <?php
40
+
41
+ ini_set('display_errors', true);
42
+
43
+ error_reporting(E_ALL);
44
+
45
+
46
+
47
+ define('UP_DIR', 'updir');
48
+
49
+
50
+
51
+ function h($string)
52
+
53
+ {
54
+
55
+ return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
56
+
57
+ }
58
+
59
+
60
+
61
+ /**
62
+
63
+ * ファイルアップロードエラーを判定する
64
+
65
+ * @param type $upfile
66
+
67
+ * @return bool
68
+
69
+ * @throws Exception
70
+
71
+ */
72
+
73
+ function check_error($upfile)
74
+
75
+ {
76
+
77
+ switch ($upfile['error']) {
78
+
79
+ case UPLOAD_ERR_OK:
80
+
81
+ return true;
82
+
83
+ case UPLOAD_ERR_INI_SIZE:
84
+
85
+ $err = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。';
86
+
87
+ break;
88
+
89
+ case UPLOAD_ERR_FORM_SIZE:
90
+
91
+ $err = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。';
92
+
93
+ break;
94
+
95
+ case UPLOAD_ERR_PARTIAL:
96
+
97
+ $err = 'アップロードされたファイルは一部のみしかアップロードされていません。';
98
+
99
+ break;
100
+
101
+ case UPLOAD_ERR_NO_FILE:
102
+
103
+ $err = 'ファイルはアップロードされませんでした。';
104
+
105
+ break;
106
+
107
+ case UPLOAD_ERR_NO_TMP_DIR:
108
+
109
+ $err = 'テンポラリフォルダがありません。';
110
+
111
+ break;
112
+
113
+ case UPLOAD_ERR_CANT_WRITE:
114
+
115
+ $err = 'ディスクへの書き込みに失敗しました。';
116
+
117
+ break;
118
+
119
+ case UPLOAD_ERR_EXTENSION:
120
+
121
+ $err = 'PHP の拡張モジュールがファイルのアップロードを中止しました。';
122
+
123
+ break;
124
+
125
+ }
126
+
127
+
128
+
129
+ if (!empty($err)) {
130
+
131
+ throw new Exception($err);
132
+
133
+ }
134
+
135
+ }
136
+
137
+
138
+
139
+ /**
140
+
141
+ * ファイルタイプをチェックし、拡張子を返す
142
+
143
+ * @param type $upfile
144
+
145
+ * @return bool
146
+
147
+ */
148
+
149
+ function check_extension($upfile)
150
+
151
+ {
152
+
153
+ $arr_accept_mimes = [
154
+
155
+ 'jpg' => 'image/jpeg'
156
+
157
+ , 'png' => 'image/png'
158
+
159
+ , 'gif' => 'image/gif'
160
+
161
+ ];
162
+
163
+
164
+
165
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
166
+
167
+ $mime_type = finfo_file($finfo, $upfile['tmp_name']);
168
+
169
+
170
+
171
+ if (in_array($mime_type, $arr_accept_mimes)) {
172
+
173
+ return array_search($mime_type, $arr_accept_mimes);
174
+
175
+ }
176
+
177
+
178
+
179
+ $msg = '許可されていないファイルタイプです。';
180
+
181
+ throw new Exception($msg);
182
+
183
+ }
184
+
185
+
186
+
187
+ if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') {
188
+
189
+
190
+
191
+ try {
192
+
193
+
194
+
195
+ $upfile = $_FILES['upfile'];
196
+
197
+
198
+
199
+ // エラーチェック
200
+
201
+ check_error($upfile);
202
+
203
+
204
+
205
+ // ファイルタイプチェック
206
+
207
+ $extension = check_extension($upfile);
208
+
209
+
210
+
211
+ $tmp_name = $upfile['tmp_name'];
212
+
213
+
214
+
215
+ // ファイル保存先 + ファイル名
216
+
217
+ $base_name = sha1_file($tmp_name) . '.' . $extension;
218
+
219
+
220
+
221
+ if (!file_exists(UP_DIR)) {
222
+
223
+ $msg = sprintf('%s ディレクトリが存在しません。', UP_DIR);
224
+
225
+ throw new Exception($msg);
226
+
227
+ }
228
+
229
+ if (!is_writable(UP_DIR)) {
230
+
231
+ $msg = sprintf('%s に書き込み権限がありません。', UP_DIR);
232
+
233
+ throw new Exception($msg);
234
+
235
+ }
236
+
237
+
238
+
239
+ $destination = UP_DIR . DIRECTORY_SEPARATOR . $base_name;
240
+
241
+ if (file_exists($destination)) {
242
+
243
+ $msg = sprintf('同一のファイルがすでにアップロードされています。', UP_DIR);
244
+
245
+ throw new Exception($msg);
246
+
247
+ }
248
+
249
+
250
+
251
+ move_uploaded_file($tmp_name, $destination);
252
+
253
+ } catch (Exception $e) {
254
+
255
+ $err = $e->getMessage();
256
+
257
+ }
258
+
259
+ }
260
+
261
+ ?><!DOCTYPE HTML>
262
+
263
+ <html lang="ja">
264
+
265
+ <head>
266
+
267
+ <meta charset="UTF-8">
268
+
269
+ <title></title>
270
+
271
+ <style type="text/css">
272
+
273
+ .error {
274
+
275
+ color: red;
276
+
277
+ }
278
+
279
+ </style>
280
+
281
+ </head>
282
+
283
+ <body>
284
+
285
+ <form action="" enctype="multipart/form-data" method="post">
286
+
287
+ <?php if (isset($err)) : ?>
288
+
289
+ <p class="error">エラー: <?= h($err); ?></p>
290
+
291
+ <?php endif; ?>
292
+
293
+
294
+
295
+ <p>
296
+
297
+ <label for="upfile">画像ファイル</label>
298
+
299
+ <input type="file" name="upfile" id="upfile" />
300
+
301
+ </p>
302
+
303
+ <p>
304
+
305
+ <button type="submit">アップロード</button>
306
+
307
+ </p>
308
+
309
+ </form>
310
+
311
+ </body>
312
+
313
+ </html>
314
+
315
+ ```
316
+
317
+
318
+
319
+ #おまけ
320
+
321
+
322
+
323
+ このサンプルコードを書く様子を動画でキャプチャしてみました。
324
+
325
+ 三流プログラマのもので申し訳ないが、デバッグの様子など見ると参考になるかも。
326
+
327
+
328
+
329
+ [https://www.youtube.com/watch?v=PEDERfokvPU](https://www.youtube.com/watch?v=PEDERfokvPU)