アップロードされたファイルの拡張子の検証方法【Codeigniter】

CodeIgniter

アップロードされたファイルの拡張子を検証する方法を解説します。

例として、アップロードされたファイルは画像形式であるかを確認するプログラムを紹介します。

スポンサーリンク

コールバックを使おう

Codeigniterのform_validationには様々な検証ルールがありますが、残念ながら拡張子を検証するルールはありません。

しかし、コールバックを使うことで独自の検証ルールを作成することが出来ます。

それでは、コールバックを使って拡張子を確認する方法を解説していきます。

コントローラの作成

まずはコントローラの作成からしましょう。

コードは以下のようになります。

public function index() {
    $this->load->view('form');
}

public function upload_image() {
    $this->load->library('form_validation');
    if ($this->form_validation->run('user_data') == FALSE) {
        $this->load->view('form');
    }
    else {
        echo '画像の送信に成功しました!';
    }
}

public function validate_image() {
    $check = TRUE;
    if ((!isset($_FILES['image'])) || $_FILES['image']['size'] == 0) {
        $this->form_validation->set_message('validate_image', 'ファイルを選択してください');
        $check = FALSE;
    }
    else if (isset($_FILES['image']) && $_FILES['image']['size'] != 0) {
        $allowedExts = array("jpeg", "jpg", "png", "JPG", "JPEG", "PNG");
        $ext = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
        }
        
        if(!in_array($ext, $allowedExts)) {
            $this->form_validation->set_message('validate_image', "無効な拡張子です");
            $check = FALSE;
        }
    }
    return $check;
}

upload_imageクラスは後から解説します。
今は、「なんか検証ルールを走らせてんなー」くらいの認識でオッケーです。

validate_imageの前半はおそらく大丈夫だと思います。
画像がセットされない、もしくは画像サイズが0のときにFALSEを返すif文です。

それではelse if文以下を解説していきます。

まず、$allowedExtsに許可する拡張子を配列で代入します。
今回は、jpeg, jpg, png, JPG, JPEG, PNGの場合のみOKとします。

$ext = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);

pathinfo関数はファイルパスに関する情報が取得できる関数です。
例えばファイル名であったり、拡張子を取得できます。

$_FILES[“image”][“name”]で渡された拡張子を含んだファイル名を取得します。
第2引数のPATHINFO_EXTENSIONは第1引数の拡張子だけを抽出することができます。

あとはin_array関数で抽出した拡張子が$allowedExtsの中の拡張子にあるかどうかをチェックしています。

validation.phpの作成

$_POST データではない配列をバリデーションするときは以下のように配列を指定することができます。

$config = array(
                'image_data' => array(         
                        'field' => 'my_image',
                        'label' => 'Image',
                        'rules' => 'callback_validate_image'
                )
        );

上記のコードをapplication\configの中に保存します。
こうすることで、image_dataという名前のバリデーションを呼び出すことができます。

コントローラのupload_imageクラスの中にあった、

if ($this->form_validation->run('user_data') == FALSE) {

というコードはuser_dataバリデーションをよびだしていたということになります。

ビューの作成

最後に以下のような感じで送信フォームのビューを作成して完成です。

<!DOCTYPE html>
<html>
<head>
    <title>画像送信フォーム</title>
</head>
<body>
    <h1>画像送信フォーム</h1>
    <?php if(!empty(validation_errors())): ?>
        <p><?= validation_errors() ?></p>
    <?php endif; ?>
    <?= form_open('front/upload_image', ['enctype' => "multipart/form-data"]) ?>>
    <input type="file" name="my_image">
    <button type="submit">送信</button>
    <?= form_close() ?>
</body>
</html>

今回はアップロードされたファイルの拡張子の検証する方法を画像の拡張子を検証する例を用いて解説しました。

理解の一助になったならば幸いです。

最後まで読んでくださってありがとうございました。

タイトルとURLをコピーしました