流れ
- リファラーを利用して、特定のページから移動してきたことを確認する。
- アップロード作業の成否を確認。($_FILESのerrorを確認)
- pathinfoメソッドなどを利用して拡張子を確認。
- ファイルの内容をfinfo_fileメソッド等を利用して確認。
- アップロードされた一時ファイルを正式なファイルとして、保存場所へ保存。
- ページ移動などの処理を行い終了。
参考Webページ
- PHP: POST メソッドによるアップロード – Manual
- PHP: $_FILES – Manual
- PHP: セッションのアップロード状況 – Manual
- PHP: コア php.ini ディレクティブに関する説明 – Manual
パフォーマンスチューニングという項目があるので、チューニングしたい時に参考になる。
$_FILES について
概要
HTTP POST を利用したアップロード時に使われるスーパーグローバル変数。
2次元配列の構造を持つ。
var_dump($_FILES) を使えば構造は把握できる。
複数ファイルを同時にアップロードする場合、
HTMLのinputタグにmultiple属性を付与して、nameの要素名の最後に[]を加えれば良い。
php.ini の upload_tmp_dir ディレクティブで一時ファイルの保存先を指定できる。
書式
$_FILES['要素名']['情報名']
要素名はHTMLのinputタグのnameで指定された文字列。
(例:<input type=”file” name=”upfile”> なら、要素名はupfileになる)
情報名については次の表の通り。
name | クライアントマシン上でのオリジナルのファイル名。 | ||
type | アップロードファイルのコンテンツタイプ。MIME型。このMIME型はPHPではチェックされないので、この値は信用しない方が良い。 | ||
size | バイト単位のサイズ。 | ||
tmp_name | サーバ上に一時保存された時の一時ファイル名。 | ||
error | アップロード時に発生したエラーのコード。 | ||
UPLOAD_ERR_OK | 0 | アップロード成功。 | |
UPLOAD_ERR_INI_SIZE | 1 | php.ini のupload_max_filesize パラメータの指定サイズを超過。 | |
UPLOAD_ERR_FORM_SIZE | 2 | HTMLフォームで指定したサイズを超過。 | |
UPLOAD_ERR_PARTIAL | 3 | ファイルは一部のみしかアップロードされていない。 | |
UPLOAD_ERR_NO_FILE | 4 | ファイルが存在しない。 | |
UPLOAD_ERR_NO_TMP_DIR | 6 | 一時保存のためのフォルダが存在しない。 | |
UPLOAD_ERR_CANT_WRITE | 7 | ディスクへの書き込みに失敗した。 | |
UPLOAD_ERR_EXTENSION | 8 | 拡張モジュールによってアップロードが中断された。読み込まれている拡張モジュールの一覧をphpinfo()で取得すれば参考にできる。 |
php.ini での設定項目について
file_uploads | アップロードを有効にするかどうか。 | 1 |
max_file_uploads | 同時にアップロードできるファイルの最大数。 | 20 |
upload_max_filesize | アップロード可能な最大サイズ。 | 2M |
upload_tmp_dir | アップロードファイルを一時的に保存するためのフォルダ。 | – |
post_max_size | ポストデータとして送信可能な最大サイズ。 | 8M |
memory_limit | 利用可能なメモリサイズ。厳密には1プロセス(または1スクリプト)が確保できる最大メモリサイズ(バイト単位)制限したくない場合は -1 を指定する。 | 128M |
max_execution_time | スクリプトの最大実行時間(秒単位) | 30 |
max_input_time | スクリプトが入力処理に利用できる最大時間(秒単位) | -1 (-1 なら、max_execution_timeの値) |
動作確認用コード(各種確認の処理は省略)
概要
XAMPPを利用して環境構築をしている。PHPは8.2.4を利用している。
ファイルサイズ1MB以下ぐらいの画像ファイルを用意して、
アップロードが無事成功していることを確認すれば良い。
Upload.php の最後のリダイレクトをコメントアウトすれば詳細が見られる。
Upload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload.html</title>
</head>
<body>
<form method="post" action="upload.php" enctype="multipart/form-data">
<label for="upfile">アップロードするファイルを選択</label><br>
<input type="file" name="upfile" id="upfile"><br>
<input type="submit" value="アップロード">
</form>
</body>
</html>
Upload.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload.html</title>
</head>
<body>
<b>var_dump($_FILES)の結果</b><br>
<?php
var_dump($_FILES);
?>
<br><br>
<b>$_FILESの内容を表示</b><br>
<?php
foreach($_FILES['upfile'] as $key => $value) {
print($key . ' : ' . $value . '<br>');
}
?>
<br><br>
<b>$_SERVER['REQUEST_METHOD']を表示。</b><br>
<?php
print($_SERVER['REQUEST_METHOD'] . '<br>');
?>
<br><br>
<?php
// アップロード後のサーバ内での処理。
// アップロードされたファイルの一時ファイル名を取得。
$temp = $_FILES['upfile']['tmp_name'];
print('$temp = ' . $temp . '<br>');
// アップロードされたファイルの元の名前を取得。
$file_name = $_FILES['upfile']['name'];
print('$file_name = ' . $file_name . '<br>');
// // 一時ファイルから正式なファイルとして保存。
if (!move_uploaded_file($temp, $file_name)) {
$err_msg = '一時ファイルから移動する時に失敗しました。';
}
// // エラーが発生した場合に表示して終了。
if (isset($err_msg)) {
die($err_msg);
}
// 処理成功後はリダイレクト。
// 動作確認時はリダイレクトする箇所をコメントアウトすると良い。
print('http://' . $_SERVER['HTTP_HOST'] . '/Upload.html');
header('Location: http://' . $_SERVER['HTTP_HOST'] . '/Upload.html');
?>
<br>
</body>
</html>