動かざることバグの如し

近づきたいよ 君の理想に

やっとPHPでアップロードする処理を書いてみた

そういえばPHPでアップロードするフォーム画面作ったことないなぁってことで作成

今回は

  • JSON形式のみアップロード可
  • 日本語含むファイル名はまだ想定していない
  • ファイルサイズ上限付き
<?php
//アップロード上限サイズ
// ini_set("post_max_size", "10M");
//アップロード先ディレクトリ
$upDir = __DIR__ . "/uploads/";
//バイト 20MBの場合
$sizeLimit = 20000000;
if (isset($_FILES['upfile']['error'])) {
    try {
        switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK:// 成功
                break;
            case UPLOAD_ERR_NO_FILE:// ファイル未選択
                throw new RuntimeException('ファイルが選択されていません');
            case UPLOAD_ERR_FORM_SIZE:// フォーム定義の最大サイズ超過
            case UPLOAD_ERR_INI_SIZE:// php.ini定義の最大サイズ超過
                throw new RuntimeException('ファイルサイズが大きすぎます');
            default:
                throw new RuntimeException('その他のエラーが発生しました');
        }
        $filePath = $upDir . $_FILES["upfile"]["name"];
        if(filesize($_FILES["upfile"]["tmp_name"]) > $sizeLimit){
            throw new RuntimeException('ファイルサイズが大きすぎます');
        }
        if(end(explode('.', $filePath)) !== "json"){
            throw new RuntimeException('JSON形式でしか読み込めません');
        }
        if(move_uploaded_file($_FILES["upfile"]["tmp_name"], $filePath) && chmod($filePath, 0644)) {
            echo 'ファイルは正常にアップロードされました';
        } else {
            throw new RuntimeException('ファイル保存時にエラーが発生しました');
        }
    } catch (RuntimeException $e) {
        echo $e->getMessage();
    }
}
?>

HTML部分

<html>
<head>
   <meta charset="utf-8">
   <title>Upper</title>
</head>
<body>
    <form action="" method="post" enctype="multipart/form-data">
        <input type="file" name="upfile" />
        <input type="submit" value="アップロード" />
    </form>
</body>
</html>