2011-10-21 8 views
31

私は以下の問題があります。私はいくつかの追加情報を含むファイルをアップロードするHTMLフォームを持っています。しかし、それはわずか10MBのファイルをアップロードすることができます。しかし、ユーザーが何か大きいものをアップロードしようとすると、$ _POST配列と$ _FILES配列は空です($ _POSTにはいくつかの値があり、$ _FILESにはいくつかの値がありますが、アップロードエラーがあることを示します)。

このような質問がいくつかありますが(空の$ _POST、$ _FILES)、解決方法や説明が見つかりませんでした。

HTMLフォーム:

print_r($_POST); // array() 
print_r($_FILES); // array() 
exit; 

upload.php

<form enctype="multipart/form-data" method="post" action="upload.php"> 
    <p> 
     <input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> 
     <input type="file" name="image" /> 
    </p> 
    <p> 
     <input type="text" name="other_field" /> 
    </p> 
</form> 

ファイルサイズは10メガバイトの下にある場合には、(ファイルサイズの上限は10MBです)、正常に動作し、私は増加したくありませんPHPでエラーをキャプチャしたいだけです。

は(私は、このセクションを逃した)PHPのサイトからPHPサイトから

を(説明/解決策を)更新: http://us.php.net/manual/en/ini.core.php#ini.post-max-size

設定許可後のデータの最大サイズを。この設定は、ファイルのアップロードにも影響します。大きなファイルをアップロードするには、この値をupload_max_filesizeより大きくする必要があります。 configureスクリプトによってメモリ制限が有効になっている場合、memory_limitはファイルのアップロードにも影響します。一般に、memory_limitはpost_max_sizeよりも大きくなければなりません。整数が使用される場合、値はバイト単位で測定されます。このFAQに記載されている簡略表記法も使用できます。ポストデータのサイズがpost_max_sizeより大きい場合、$ _POSTおよび$ _FILESスーパーグローバルは空です。これは様々な方法で追跡することができます。データを処理しているスクリプトに$ _GET変数を渡します。つまり、$ _GET ['processed']が設定されているかどうかを確認します。

+1

あなたが読んだことがあります。http下記:/ /php.net/manual/en/features.file-upload.php? –

+2

ええ、多分私はそこに何かを逃した。この場合、$ _FILES配列と$ _POST配列はどちらも空です。エラーコードを渡す必要があるようです。 –

答えて

28

編集した質問に記載されているように、PHPが自動的にデータを破棄すると、$ _POSTと$ _FILESは空になります(実際のデータがpost_max_sizeより大きい場合に発生します)。 HTTPヘッダーと$ _GETはそのまま残っているので、破棄を検出するために使用できます。

オプションA)

if(intval($_SERVER['CONTENT_LENGTH'])>0 && count($_POST)===0){ 
    throw new Exception('PHP discarded POST data because of request exceeding post_max_size.'); 
} 

オプションB)
は、POSTデータが存在するかどうかを指示するGETパラメータを追加します。

+0

"例外をスロー"のために+1 – evilReiko

+1

注:$ _SERVER ['CONTENT_LENGTH']は常に "常に"設定されていません。サーバーホストはこの変数を表示させないようにすることができます – evilReiko

+1

ありがとう、これが答えです! – brentonstrine

0

クライアントとサーバーの両方にいくつかの制限があります。

クライアント側では、MAX_FILE_SIZEフィールドは多用されていません。おそらくブラウザがヒントとして使用する可能性があります。むしろブラウザは設定された制限に従います。サーバー側では

、ためにphp.iniを確認してください。

upload_max_filesize = 5M 

post_max_size = 5M 

max_input_time = ... 

も削除POSTボディまたは例えば約ノートのためのApacheのログを確認してください。

+0

ええ、私は限界があることを知っていますが、限界に達したときにエラーを出すべきではありませんか? –

+0

http://php.net/manual/en/features.file-upload.errors.php – Crontab

11

phpinfo()を実行し、upload_max_filesizeおよびpost_max_sizeディレクティブが十分大きいことを確認してください。

http://us.php.net/manual/en/ini.core.php#ini.upload-max-filesize

http://us.php.net/manual/en/ini.core.php#ini.post-max-size

+1

これはなぜ '$ _POST'が空であるのかという問題には対処しません。ファイルサイズにエラーがあった場合、空の '$ _POST'ではなく、エラーメッセージが表示されます。 – brentonstrine

+0

@brentonstrine 2011年の10月から、ほぼ3年前の投稿を真剣に** necro'ingしていますか? OPは、 'post_max_size'よりも大きなファイルを送信しようとしていました。これは順番に(OPを読む)、 '$ _POST'と' $ _FILES'を空にします。 – Crontab

+3

その意図は文句を言うことではありませんでした。あなたの答えは、Augustusの答えよりも高く評価されました。これは実際に問題が何であるかを実際に説明するためのものであり、$ _POSTが最大値を超えたために空であることを検出する解決法を提供します。私は彼の意見を賛美し、あなたの意見を落として、彼の答えが一番最初になるようにしました。そのコメントは、単にダウンボートの説明として意味されていました。しかし、私はdownvoteに立っています。情報の重要な部分は*なぜ* '$ _POST'が空であるかです。投稿数が – brentonstrine

-1

あなたはとアップロードのエラーをチェックすることができます

if ($_FILES['images']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['images']['error']); 
} 

エラーコードはhereに定義されています。

+2

彼は '$ _FILES'は空だと言いました。存在しないものを確認することはできません。 – mpen

1

私が言及することができるあなたが処理する場合、フォームのような

if(isset($_POST['submit']) 

post_max_sizeのがポストされたデータよりも低い場合には、次に$ _POST空になります[「提出」]

関連する問題