#サンプルコード
要件に合わせて、改変してください。
php
1<?php
2
34 * index.php
5
6require 'common.php';
7
8// Smrtyをインスタンス化
9$smarty = new Smarty();
10
11// アップロード時
12if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') {
13
14 $upload = $_FILES['upload'];
15
16 // アップロード失敗時
17 if ($upload['error'] > 0) {
18 $smarty->assign('error', uploadError($upload['error']));
19 }
20 // アップロード成功時
21 else {
22
23 // 書き込みディレクトリ存在チェック
24 if (!file_exists(UPDIR) && !mkdir(UPDIR, 0660, TRUE)) {
25 $smarty->assign('error', '保存先ディレクトリの作成に失敗しました。');
26 }
27 // 書き込み権限
28 else if (!is_writable(UPDIR)) {
29 $smarty->assign('error', '保存先ディレクトリに書き込み権限がありません。');
30 }
31
32 // バリデーション
33 $filename = $upload['tmp_name'];
34
35 // 拡張子取得
36 $ext = checkFileType($filename);
37
38 // ファイルタイプのチェック
39 if (!$ext) {
40 $smarty->assign('error', '許可されていないファイルタイプです。');
41 }
42
43 // バリデーション通過時
44 if (null == $smarty->getTemplateVars('error')) {
45
46 $basename = sprintf('%s.%s', uniqid(), $ext);
47 $destination = sprintf('./%s/%s', UPDIR, $basename);
48
49 move_uploaded_file($filename, $destination);
50 }
51 }
52}
53
54$smarty->display('index.tpl');
php
1<?php
2
34 * common.php
5
6ini_set('display_errors', 1);
7error_reporting(E_ALL);
8
9require 'vendor/autoload.php';
10
11// アップロードしたファイルの格納ディレクトリ
12define('UPDIR', 'upload');
13
1415 * エラー種別の判定をする
161718
19function uploadError($errorNumber)
20{
21 switch ($errorNumber) {
22 case UPLOAD_ERR_INI_SIZE: // 1
23 $err = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。';
24 break;
25 case UPLOAD_ERR_FORM_SIZE: // 2
26 $err = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。';
27 break;
28 case UPLOAD_ERR_PARTIAL: // 3
29 $err = 'アップロードされたファイルは一部のみしかアップロードされていません。';
30 break;
31 case UPLOAD_ERR_NO_FILE: // 4
32 $err = 'ファイルはアップロードされませんでした。';
33 break;
34 case UPLOAD_ERR_NO_TMP_DIR: // 6
35 $err = 'テンポラリフォルダがありません。PHP 5.0.3 で導入されました。';
36 break;
37 case UPLOAD_ERR_CANT_WRITE: // 7
38 $err = 'ディスクへの書き込みに失敗しました。PHP 5.1.0 で導入されました。';
39 break;
40 case UPLOAD_ERR_EXTENSION: // 8
41 $err = 'PHP の拡張モジュールがファイルのアップロードを中止しました。';
42 break;
43 }
44 return $err;
45}
46
4748 * ファイルタイプのチェック
4950
51function checkFileType($filename)
52{
53 $finfo = finfo_open(FILEINFO_MIME_TYPE);
54 $filetype = finfo_file($finfo, $filename);
55 finfo_close($finfo);
56
57 // 許可するMIME_TYPEを列挙
58 $allowed = [
59 'jpg' => 'image/jpeg'
60 , 'png' => 'image/png'
61 , 'gif' => 'image/gif'
62 ];
63
64 return array_search($filetype, $allowed);
65}
html
1{*
2 * index.tpl
3 *}
4<!DOCTYPE HTML>
5<html lang="ja">
6 <head>
7 <meta charset="UTF-8">
8 <title>ファイルアップロード</title>
9 </head>
10 <body>
11
12 {if $error|default:null != null}
13 <p>{$error}</p>
14 {/if}
15
16 <form action="" method="post" enctype="multipart/form-data">
17 <p>
18 <label for="upload">ファイル</label>
19 <input type="file" name="upload" id="upload" />
20 </p>
21 <p>
22 <button>SUBMIT</button>
23 </p>
24 </form>
25 </body>
26</html>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/16 05:11
退会済みユーザー
2016/12/16 05:31 編集
2016/12/16 06:36