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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Smarty

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

Q&A

解決済

3回答

6084閲覧

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

amaguri

総合スコア227

PHP

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

Smarty

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

0グッド

2クリップ

投稿2017/01/12 07:11

編集2017/01/12 07:29

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}">

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2017/01/12 07:18

zico_teratail

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/01/12 07:33

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

2017/01/12 07:53

「upload_max_filesizeを超えるファイルがPHPでの処理対象となってしまう」という事態がもしあったとすれば、それはPHP処理系のバグなので、(現実に発生していて、それに対応しないといけない場面でもない限り)基本的に無視して大丈夫です。 (もっとも、そういう「PHP側での設定値」を「アプリケーション内での制限値」として積極的に活用する姿勢に、疑問がないといえば嘘にはなりますが)
guest

0

ベストアンサー

#サンプルコード

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

php

1<?php 2/** 3 * index.php 4 */ 5require 'vendor/autoload.php'; 6 7// Smarty 8$smarty = new Smarty(); 9 10if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { 11 12 $upfile = $_FILES['upfile']; 13 14 // アップロードに失敗したとき 15 if ($upfile['error'] > 0) { 16 // @see http://php.net/manual/ja/features.file-upload.errors.php 17 switch ($upfile['error']) { 18 case UPLOAD_ERR_INI_SIZE: 19 $errorMsg = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。'; 20 break; 21 case UPLOAD_ERR_FORM_SIZE: 22 $errorMsg = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。'; 23 break; 24 case UPLOAD_ERR_PARTIAL: 25 $errorMsg = 'アップロードされたファイルは一部のみしかアップロードされていません。'; 26 break; 27 case UPLOAD_ERR_NO_FILE: 28 $errorMsg = 'ファイルはアップロードされませんでした。'; 29 break; 30 case UPLOAD_ERR_NO_TMP_DIR: 31 $errorMsg = 'テンポラリフォルダがありません。'; 32 break; 33 case UPLOAD_ERR_CANT_WRITE: 34 $errorMsg = 'ディスクへの書き込みに失敗しました。'; 35 break; 36 case UPLOAD_ERR_EXTENSION: 37 $errorMsg = 'PHP の拡張モジュールがファイルのアップロードを中止しました。'; 38 break; 39 default : 40 break; 41 } 42 if (isset($errorMsg)) { 43 $smarty->assign('errorMsg', $errorMsg); 44 } 45 } else { 46 if (!file_exists('upfiles')) { 47 mkdir('upfiles', 0700, true); 48 } 49 $destination = 'upfiles/' . sha1_file($upfile['tmp_name']); 50 move_uploaded_file($upfile['tmp_name'], $destination); 51 } 52} 53 54$smarty->display('index.tpl');

index.tpl

html

1<!DOCTYPE HTML> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <form action="" method="post" enctype="multipart/form-data"> 9 <input type="file" name="upfile" /> 10 <input type="submit" id="btn_submit" value="送信する" /> 11 </form> 12 </body> 13</html>

投稿2017/01/12 07:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/01/12 08:08

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

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 07:17

編集2017/01/12 07:24
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/01/12 07:22

なるほどやはり HTML側でやるしかないようですかね? 今回smartyにて実装を考えているのですが 例えば $file_sizeの数値から バイト数を計算する計算式をphp側で書き その計算式で導かれて出たバイト数をHTML側に渡し <input type="hidden" name="MAX_FILE_SIZE" value="$導かれたバイト数"> とするのは現実的ではないでしょうか?
maisumakun

2017/01/12 07:25

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

2017/01/12 07:33

サーバで設定されたファイルサイズの許容を超えた場合 バリデーションが勝手にかかり、 ファイルは削除され $_FILES[フォームのname]['error']にUPLOAD_ERR_INI_SIZE(1) というのが残るということですね。 これを事前に防ぐ方向を実装しようと思うのですが マニュアル読んできたいと思います。
maisumakun

2017/01/12 07:41

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

2017/01/12 07:46

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

2017/01/12 08:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問