質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.85%

  • PHP

    18209questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Smarty

    157questions

    Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

phpinfoから取得したupload_max_filesizeを使ってバリデーションをかけたい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 776

amaguri

score 211

smartyにて実装を考えています。

phpinfoより

$file_size = ini_get('upload_max_filesize');
var_dump($file_size);

//結果
2M


と表示されました。
前提としてく
$file_sizeは今後変わる可能性があります。

ファイルアップロードのフォームに
$file_sizeより大きいファイルがアップロードされようとしている時にエラーが吐かれるコードを書きたいのです。

この場合は
どのように$file_sizeを使ってあげれば
バリデーションをかけることができますでしょうか?

HTML側
<input type="hidden" name="MAX_FILE_SIZE" value="サイズ指定">

とするのがやはり一般的でしょうか?

追加

php側

$バイト数 = $file_size をバイト数に変換する計算式;

$tpl->assign('maxsize',$バイト数)
HTML側
<input type="hidden" name="MAX_FILE_SIZE" value="{$maxsize}">

などのように実装することは現実的かつ可能でしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

サンプルコード

ini_get('upload_max_filesize'); を利用する必要はありません。

<?php
/**
 * index.php
 */
require 'vendor/autoload.php';

// Smarty
$smarty = new Smarty();

if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') {

    $upfile = $_FILES['upfile'];

    // アップロードに失敗したとき
    if ($upfile['error'] > 0) {
        // @see http://php.net/manual/ja/features.file-upload.errors.php
        switch ($upfile['error']) {
            case UPLOAD_ERR_INI_SIZE:
                $errorMsg = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。';
                break;
            case UPLOAD_ERR_FORM_SIZE:
                $errorMsg = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。';
                break;
            case UPLOAD_ERR_PARTIAL:
                $errorMsg = 'アップロードされたファイルは一部のみしかアップロードされていません。';
                break;
            case UPLOAD_ERR_NO_FILE:
                $errorMsg = 'ファイルはアップロードされませんでした。';
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                $errorMsg = 'テンポラリフォルダがありません。';
                break;
            case UPLOAD_ERR_CANT_WRITE:
                $errorMsg = 'ディスクへの書き込みに失敗しました。';
                break;
            case UPLOAD_ERR_EXTENSION:
                $errorMsg = 'PHP の拡張モジュールがファイルのアップロードを中止しました。';
                break;
            default :
                break;
        }
        if (isset($errorMsg)) {
            $smarty->assign('errorMsg', $errorMsg);
        }
    } else {
        if (!file_exists('upfiles')) {
            mkdir('upfiles', 0700, true);
        }
        $destination = 'upfiles/' . sha1_file($upfile['tmp_name']);
        move_uploaded_file($upfile['tmp_name'], $destination);
    }
}

$smarty->display('index.tpl');

index.tpl

<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="" method="post" enctype="multipart/form-data">
            <input type="file" name="upfile" />
            <input type="submit" id="btn_submit" value="送信する" />
        </form>
    </body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 17:08

    回答ありがとうございます。
    エラーに関して中身を見るということですね!これを参考にさせていただきます。

    キャンセル

0

POSTされたファイルのデータがupload_max_filesizeより大きかった場合、PHPのコードを実行する前にファイルは削除されてしまい、$_FILES[フォームのname]['error']UPLOAD_ERR_INI_SIZE(1)という値を残します(PHPマニュアル)。自分でバリデーションを行わなくても、これは強制的に適用されます

また、このデータをフォーム側に送って、JavaScriptでバリデーションすることも、File APIの実装されたブラウザ(IE 10以降を含むモダンブラウザ)であれば可能です。(type=fileのinputオブジェクト).files[0].sizeにバイト単位の大きさが入っていますので、これをチェックすれば容量チェックはできます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 16:22

    なるほどやはり
    HTML側でやるしかないようですかね?

    今回smartyにて実装を考えているのですが
    例えば
    $file_sizeの数値から
    バイト数を計算する計算式をphp側で書き

    その計算式で導かれて出たバイト数をHTML側に渡し

    <input type="hidden" name="MAX_FILE_SIZE" value="$導かれたバイト数">

    とするのは現実的ではないでしょうか?

    キャンセル

  • 2017/01/12 16:25

    自分自身も誤解していたのでコメント中に回答を書き換えましたが、$_FILES内に容量超過のエラーは残るので、(リミットがそこでいいなら)そのまま使うこともできるようです。

    キャンセル

  • 2017/01/12 16:33

    サーバで設定されたファイルサイズの許容を超えた場合
    バリデーションが勝手にかかり、
    ファイルは削除され
    $_FILES[フォームのname]['error']にUPLOAD_ERR_INI_SIZE(1)
    というのが残るということですね。

    これを事前に防ぐ方向を実装しようと思うのですが
    マニュアル読んできたいと思います。

    キャンセル

  • 2017/01/12 16:41

    元の回答で書いていたとおり、$_FILESの処理はPHPコードの実行「前」に行われますので、PHPで書いてどうにかする方法はなさそうです。

    キャンセル

  • 2017/01/12 16:46

    …というより、「事前に」の意味が「ファイルを送らずに」ということであれば、JavaScriptが最適な箇所となります(もちろん、JavaScriptでのバリデーションはあくまでユーザーの利便性向上のためであって、セキュリティ的に役に立つものではないことは大前提となりますが、今回の場合は突破してもPHPが削除するだけなので、悪影響はありませんし)。

    キャンセル

  • 2017/01/12 17:10

    なるほど
    丁寧に回答いただきとてもわかりやすかったです!
    送らずということと
    送った後の時のエラー処理と
    理解することができたました。
    今一度描いてみてまたなにかわからないところがあった場合質問させていただきます!

    キャンセル

0

HTMLのhiddenで指定してもいいけど、それは無視して突破しようと思えばいくらでも出来てしまうので、やはりPHP側でもサイズチェックをする必要があると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 16:33

    なるほどやはり
    HTML側だけではセキュリティ的に貧弱ということですね、、
    その場合phpで見る方法などはありますでしょうか?

    キャンセル

  • 2017/01/12 16:53

    「upload_max_filesizeを超えるファイルがPHPでの処理対象となってしまう」という事態がもしあったとすれば、それはPHP処理系のバグなので、(現実に発生していて、それに対応しないといけない場面でもない限り)基本的に無視して大丈夫です。

    (もっとも、そういう「PHP側での設定値」を「アプリケーション内での制限値」として積極的に活用する姿勢に、疑問がないといえば嘘にはなりますが)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18209questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Smarty

    157questions

    Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。