1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<?php
/* ---------------------------------------------------------------------------------------------
* フォーム処理:ファイルアップロードしたファイル管理する処理の例
* 2015.09.29 作成 yoshi of CXMedia Inc.
* -----------------------------------------------------------------------------------------
* -- ファイルアップロードのファイル容量チェックの方法は、--
* input type=hiddenで、name="MAX_FILE_SIZE" value="最大ファイルサイズ"で指定する場合と
* $_FILES[xxxx]['size']で最大値チェックする場合があります。今回は、前者で記述(フォーム上を参照)
* --------------------------------------------------------------------------------------------- */
/* --------------------
* 初期値設定
---------------------- */
// アップロードファイルのディレクトリ
define ("UPLOAD_DIR", "data/upload/");
// アップロードファイル管理ファイル
define ("DATA_DIR","data/");
define ("OUTFILE_PATH", DATA_DIR."img_file.txt");
// アップロードのエラーリスト(配列の添字とUPLOAD予約名の値は対応しています)
$upload_error = array(
'UPLOAD_OK',
'UPLOAD_ERR_INI_SIZE:アップロードファイルは、php.iniのupload_max_filesize ディレクティブ値オーバー。',
'UPLOAD_ERR_FORM_SIZE:アップロードファイルは、HTML フォームで指定された MAX_FILE_SIZE をオーバー。',
'UPLOAD_ERR_PARTIAL:アップロードファイルは一部のみしかアップロードされていない。',
'UPLOAD_ERR_NO_FILE:ファイルはアップロードされませんでした。',
'',
'UPLOAD_ERR_NO_TMP_DIR:テンポラリフォルダがありません。 ',
'UPLOAD_ERR_CANT_WRITE:ディスクへの書き込みに失敗しました。(PHP 5.1.0 で導入)',
'UPLOAD_ERR_EXTENSION:PHP の拡張モジュールがファイルのアップロードを中止。'.
' どの拡張モジュールがファイルアップロードを中止させたのかを突き止めることはできません。'
);
// 拡張子のテーブル //
$extfile_table = array('gif','jpg','jpeg','png');
// カテゴリの種類リスト
$category_tbl = array(
'c1'=>'風景',
'c2'=>'人物',
'c3'=>'行事',
'c4'=>'旅行',
'c5'=>'料理',
'ce'=>'その他'
);
// ヘッダー出力表示
html_header();
/* ----------------------------------
* ディレクトリの環境設定(作成)
* ---------------------------------- */
if(!is_dir(UPLOAD_DIR)){mkdir(UPLOAD_DIR,755);}
if(!is_dir(DATA_DIR)) {mkdir(DATA_DIR,755);}
/* ---------------------------------
* FormのPOSTされたとき
* --------------------------------- */
if( isset($_POST["submit"]) ){
/* ------------------------------------
* フォーム入力によるCGIデータセット
* ------------------------------------ */
// カテゴリーのデータを配列でセット(注:checkedされた項目のみがセットされる)
$category = isset($_POST['category'])? $_POST['category'] : array();
// エラーが発生したかどうかの判断用
$err_switch = '';
/* ------------------------
* 画像のアップロード
* ------------------------ */
/* ------------------------------------------------------------------------
* --- スーパーグローバル変数 $_FILES['xxx'][予約名]の形式 ---
* 'xxx'は、input要素fileタイプの、name属性で指定したもの
* 予約名は、固定で、'error','name','tmp_name','size'の4種類(以下参照)
* ------------------------------------------------------------------------- */
// スーパーグローバル変数から、アップロードのエラーの判断
if(isset($_FILES['upfile']['error']) && $_FILES['upfile']['error'] === UPLOAD_ERR_OK){
// スーパーグローバル変数からアップロード情報のセット
$file_name = $_FILES['upfile']['name']; // アップロードファイル名のパス
$file_tmp = $_FILES['upfile']['tmp_name']; // テンポラリーファイルのパス
$file_size = $_FILES['upfile']['size']; // アップロードしたファイル容量
// 拡張子のチェック
$ext_file = preg_match("/\.(.+)$/",$file_name,$match)? strtolower($match[1]) : '';
if(array_search($ext_file,$extfile_table) === false){
// 拡張子のエラー
$err_switch++;
error_print("■対象外の拡張子エラー:{$file_name}→{$ext_file}");
}
// 拡張子チェックOKのとき
else {
// 年月日時刻の画像ファイル名として保存パスの設定
$file_new_name = 'up_'.date("ymd_His").'.'.$ext_file;
// テンポラリの画像ファイルを指定したディレクトリへ移動(移動結果の判断)
if(!move_uploaded_file($file_tmp,UPLOAD_DIR.$file_new_name)){
$err_switch++;
error_print("■ファイルアップロード後のmove処理エラー:{$file_name}");
}
}
}
// アップロードエラーのとき、エラー内容のセットと表示
else {
$err_switch++;
$err_msg = "■エラー:".$upload_error[ $_FILES["upfile"]["error"] ];
error_print($err_msg);
}
// エラー状態の判断
if(!$err_switch){
/* ------------------------------
* ファイル追加出力処理
* ------------------------------ */
//画像の大きさのセット
list($size_x,$size_y) = getimagesize(UPLOAD_DIR.$file_new_name);
$img_size = $size_x.'x'.$size_y;
// 表示用の画像横幅調整
$width = ($size_x > 800)? '800' : $size_x;
// アップロードリストファイルがあるか判断して、ない場合は初期ファイル作成
if( !file_exists($mst_namefile_path) ){
touch(OUTFILE_PATH);
}
// 1アイテム分追加のファイル出力
$fh = @ fopen(OUTFILE_PATH,"a+") or die("ファイルの出力ができません");
flock($fh,LOCK_EX);
//管理ファイル出力用のデータセット
$out_data = array(
seq_num_get($fh), //[0]ID番号→自動採番Noの最大値取得
$file_new_name, //[1]画像保存ファイル名
implode(",",$category), //[2]カテゴリーリスト
$file_size, //[3]ファイル容量
$img_size, //[4]画像の大きさ(横x縦)
$file_name, //[5]元ファイル名
date("Y-m-d_H:i:s") //[6]ファイル更新日
);
fputcsv($fh,$out_data,"\t");
flock($fh,LOCK_UN);
fclose($fh);
// 登録完了メッセージ出力
echo "■ファイル・アップロード:({$file_size})byte [ {$file_name} ]の登録処理が完了しました。".
"(ID: {$seq_num})<br><br>";
// アップロード画像のリンク表示
echo '<p><img src="'.UPLOAD_DIR.$file_new_name.'" alt="'.$file_name.'" width="'.$width.'"></p>';
}
// フォーム入力に戻るボタン
echo '<p><a href="'.$_SERVER['PHP_SELF'].'">戻る</a></p>';
}
// ---- 登録フォームの表示処理 ---- //
else {
html_forminput();
}
// フッター出力表示
html_header();
exit;
/* ----------------------------------------------
* 管理ファイルからID番号(自動連番No.)をセット
* ---------------------------------------------- */
function seq_num_get($fh){
$seq_num = 0;
// ID番号:ファイル終端から1つ手前が最大値
while(($data=fgetcsv($fh,0,"\t")) !== false){
$seq_num = $data[0];
}
return ($seq_num+1);
}
/* ---------------------------------------------
* エラーメッセージの赤字出力
* --------------------------------------------- */
function error_print($str){
echo '<p class="color_red">',$str,'</p>';
}
/* ---------------------------------------------
* HTML入力フォームのヒアドキュメント出力
* --------------------------------------------- */
function html_forminput(){
//ファイルのカテゴリフォームの作成
global $category_tbl;
$catg_form = '';
foreach($category_tbl as $idx => $value){
// name属性の"category[]"は、配列の[]で複数の追加セットを意味します
$catg_form .= '<input type="checkbox" name="category[]" value="'.$idx.'">'.$value.' ';
}
echo <<< _EOF_
<h2>〓〓ファイルアップロードのフォーム入力〓〓</h2>
<dl>
<form method="post" action="{$_SERVER['PHP_SELF']}" enctype="multipart/form-data">
<!-- MAX_FILE_SIZE は、必ずinput要素の"file"より前に記述(最大容量は、valueで指定) -->
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
<dt class="border_15">カテゴリ(複数選択可)</dt>
<dd>{$catg_form}</dd>
<dt class="border_15">ファイルのアップロード選択</dt>
<dd><input type="file" name="upfile" size="60"></dd>
<dt class="align_c"><br><input type="submit" name="submit" value="送信">
<input type="reset" value="クリア"></dd>
</form>
</dl>
_EOF_;
}
/* ----------------------------------------------- #
* HTMLヘッダのヒアドキュメント出力
* ----------------------------------------------- */
function html_header(){
echo <<<_EOF_
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>フォーム処理:ファイルアップロード</title>
<style>
/* CSS tag reset */
html,body,h2{ margin:0; padding:0;}
.container{
width:800px;
margin:0 auto;
background-color: #CCFFFF;
font-size:14px;
}
.border_15{
margin-left: 5px;
margin-top: 15px;
padding-left:5px;
border-left :8px solid #CC0099;
}
.color_red{color:#FF0000;}
.align_c{text-align:center;}
</style>
</head>
<body>
<div class="container">
_EOF_;
}
/* ----------------------------------------------
* HTMLフッターのヒアドキュメント出力
* ---------------------------------------------- */
function html_footer(){
echo <<<_EOF_
</div>
</body>
</html>
_EOF_;
}
?>