Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】UPLOAD_ERR_OK定数の使い方

UPLOAD_ERR_OK定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

UPLOAD_ERR_OK定数は、PHPでファイルをサーバーへアップロードする際に、エラーが一切発生せず、処理が正常に完了した状態を表す定数です。この定数は、ファイルアップロードの成功を示すための特別な値であり、具体的には数値の 0 を保持しています。

PHPでファイルアップロードを扱う際には、$_FILES というスーパーグローバル変数を使用します。この $_FILES 変数には、アップロードされたファイルに関する様々な情報が、配列形式で格納されています。特に重要なのが、$_FILES['フォームのname属性']['error'] という要素です。この error 要素には、ファイルのアップロード処理中に発生したエラーの種類を示す数値が自動的に設定されます。

システムエンジニアがファイルアップロード処理を実装する際には、この error 要素の値と UPLOAD_ERR_OK 定数を比較することが一般的です。もし $_FILES['フォームのname属性']['error'] の値が UPLOAD_ERR_OK と一致する場合、それはファイルがサーバーに問題なく転送されたことを意味します。これにより、開発者は次の処理(例えば、ファイルを指定のディレクトリに移動する move_uploaded_file 関数を実行するなど)に進むことができます。

反対に、error の値が UPLOAD_ERR_OK 以外の定数(例: UPLOAD_ERR_INI_SIZEUPLOAD_ERR_PARTIAL など)である場合は、ファイルサイズオーバーや部分的アップロードといった何らかの問題が発生しているため、適切なエラーメッセージをユーザーに表示するなどの対応が必要となります。この定数を用いることで、ファイルのアップロード処理におけるエラーハンドリングを明確かつ標準的に行うことができるため、堅牢なアプリケーション開発に役立ちます。

構文(syntax)

1$uploadSuccess = ($_FILES['file_input_name']['error'] === UPLOAD_ERR_OK);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHPで$_FILESとUPLOAD_ERR_OKを使ったファイルアップロード処理

1<?php
2
3/**
4 * ファイルアップロードを処理する関数。
5 * UPLOAD_ERR_OK定数を使用して、ファイルのアップロードが成功したかを確認します。
6 */
7function handleFileUpload(): void
8{
9    // リクエストメソッドがPOSTであるかを確認
10    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
11        // 'fileToUpload'という名前でファイルがアップロードされたかを確認
12        if (isset($_FILES['fileToUpload'])) {
13            $file = $_FILES['fileToUpload'];
14
15            // UPLOAD_ERR_OKは、ファイルがエラーなく正常にアップロードされたことを示す定数です。(値は0)
16            if ($file['error'] === UPLOAD_ERR_OK) {
17                // アップロードファイルの元の名前を取得
18                $fileName = basename($file['name']);
19                // ファイルを保存するディレクトリ
20                $uploadDir = 'uploads/';
21                // 保存先のパスを生成
22                $targetFilePath = $uploadDir . $fileName;
23
24                // アップロードディレクトリが存在しない場合は作成
25                // 実際の運用では、パーミッション設定(0755など)も考慮が必要です。
26                if (!is_dir($uploadDir)) {
27                    mkdir($uploadDir, 0777, true);
28                }
29
30                // 一時的に保存されたファイルを最終的な場所へ移動
31                if (move_uploaded_file($file['tmp_name'], $targetFilePath)) {
32                    echo "ファイル「" . htmlspecialchars($fileName) . "」のアップロードに成功しました。<br>";
33                    echo "保存先: " . htmlspecialchars($targetFilePath);
34                } else {
35                    echo "ファイルの移動中にエラーが発生しました。<br>";
36                }
37            } else {
38                // UPLOAD_ERR_OK以外の場合、アップロードに何らかのエラーが発生しています。
39                echo "ファイルのアップロード中にエラーが発生しました。<br>";
40                echo "エラーコード: " . $file['error'] . "<br>";
41
42                // エラーコードに基づいて詳細なメッセージを表示
43                switch ($file['error']) {
44                    case UPLOAD_ERR_INI_SIZE:
45                        echo "詳細: php.ini の upload_max_filesize を超えています。<br>";
46                        break;
47                    case UPLOAD_ERR_FORM_SIZE:
48                        echo "詳細: HTMLフォームで指定された MAX_FILE_SIZE を超えています。<br>";
49                        break;
50                    case UPLOAD_ERR_PARTIAL:
51                        echo "詳細: ファイルが部分的にしかアップロードされませんでした。<br>";
52                        break;
53                    case UPLOAD_ERR_NO_FILE:
54                        echo "詳細: ファイルが選択されていません。<br>";
55                        break;
56                    case UPLOAD_ERR_NO_TMP_DIR:
57                        echo "詳細: 一時フォルダがありません。<br>";
58                        break;
59                    case UPLOAD_ERR_CANT_WRITE:
60                        echo "詳細: ディスクへの書き込みに失敗しました。<br>";
61                        break;
62                    case UPLOAD_ERR_EXTENSION:
63                        echo "詳細: PHPの拡張機能によりファイルのアップロードが停止されました。<br>";
64                        break;
65                    default:
66                        echo "詳細: 不明なアップロードエラー。<br>";
67                        break;
68                }
69            }
70        } else {
71            echo "アップロードされたファイルがありません。<br>";
72        }
73    }
74}
75?>
76<!DOCTYPE html>
77<html lang="ja">
78<head>
79    <meta charset="UTF-8">
80    <meta name="viewport" content="width=device-width, initial-scale=1.0">
81    <title>ファイルアップロードの例</title>
82</head>
83<body>
84    <h1>ファイルをアップロードする例</h1>
85
86    <?php
87    // ファイルアップロード処理を実行
88    handleFileUpload();
89    ?>
90
91    <form action="" method="post" enctype="multipart/form-data">
92        <label for="fileToUpload">アップロードするファイルを選択:</label>
93        <input type="file" name="fileToUpload" id="fileToUpload">
94        <br><br>
95        <input type="submit" value="ファイルをアップロード" name="submit">
96    </form>
97</body>
98</html>

PHPのUPLOAD_ERR_OKは、ファイルアップロード処理の際に使用される組み込み定数です。この定数は、ファイルがサーバーへエラーなく正常にアップロードされたことを示し、その値は0です。

PHPでファイルをアップロードする際には、$_FILESというスーパーグローバル配列を通してアップロードされたファイルの情報にアクセスします。この$_FILES配列の中には、アップロードされたファイルの各種情報に加えて、アップロード時のエラーコードが格納される'error'キーが存在します。

サンプルコードでは、$_FILES['fileToUpload']['error']の値がUPLOAD_ERR_OKと等しいかどうかを確認することで、ファイルアップロードが成功したかを判断しています。このチェックが成功した場合にのみ、アップロードされたファイルを一時的な場所から最終的な保存先へ移動する処理(move_uploaded_file関数など)が実行されます。もしUPLOAD_ERR_OK以外のエラーコードが格納されていた場合は、アップロード中に何らかの問題が発生したことを意味し、コードはエラーの種類に応じて詳細なメッセージを表示しています。

UPLOAD_ERR_OK自体に引数や戻り値はなく、その値(0)によってアップロードの成否を判断するためのマーカーとして機能します。ファイルアップロード処理を安全かつ正確に行う上で不可欠な定数です。

ファイルアップロード処理では、UPLOAD_ERR_OKで成功を判断するだけでなく、アップロードされたファイルのセキュリティ対策が特に重要です。サンプルコードではファイルの種類や内容を検証していませんが、悪意のあるファイルがアップロードされるリスクを防ぐため、拡張子、MIMEタイプ、ファイルサイズ、そして実際のファイル内容を必ず確認してください。また、mkdirで一時的に指定しているディレクトリのパーミッション0777は開発環境向けです。本番環境ではセキュリティを考慮し、書き込み権限を厳しく制限した0755のような適切なパーミッションを設定することが必須となります。ファイル名が重複すると既存ファイルが上書きされる可能性があるため、保存時には一意なファイル名に変換するなどの考慮も必要です。

関連コンテンツ