【PHP】ファイルアップロードの重さ制限の動的変更法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,801

nnahito

score 1816

 質問

PHPとJavaScriptを用いてファイルの非同期アップロード時の,
PHPのアップロード制限を動的に緩くしたい.
例)デフォルト2MBを300MBに,など.
例)perlでは,$CGI::POST_MAX = 1024 * 1024 * 300;とすると動的変更ができます.これをPHPで行いたい

 いろいろ調べてみたが…

php.iniなどをいじらないとできないのでしょうか?
レンタルサーバですので,php.iniは触れません.

何かご存じの方がいらっしゃいましたら,ご教授ください.
よろしくお願いいたします.

 参考

XMLHttpRequest について
POST メソッドによるアップロード
PHPのファイルアップロードサイズの上限値を変更する

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+4

http://php.net/manual/ja/ini.list.php
上記を見ると、PHP_INI_PERDIRとあるので、
http://php.net/manual/ja/configuration.changes.modes.php
php.ini,.htaccess,httpd.conf,.user.iniで設定可能なようです。(つまりPHPのスクリプト内からは変更できない)
.htaccessは使用できないでしょうか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/24 21:25

    ご回答有り難うございます.
    .htaccessは利用できると思います.

    .htaccessについて調べてみたのですが,
    http://www.php-factory.net/trivia/05.php
    のようなページを見つけました.

    しかし,内容がイマイチわかりません.

    #メモリ使用量の上限
    php_value memory_limit 20M
    これは,一度に送信するバイト数ということでしょうか?

    #POSTデータの最大サイズ ※合計サイズ
    php_value post_max_size 20M
    これは……何でしょう?
    保存できる最大サイズ…?

    #1ファイルあたりの最大アップロードサイズ
    php_value upload_max_filesize 20M
    今回の場合,この値がキーになるのでしょうか?

    よろしくお願いいたします.

    キャンセル

  • 2015/12/25 09:12

    ほかの回答で示されてはいますが一応…
    `memory_limit`はPHP側で使用するメモリ上限で、ファイルアップロードはメモリに展開されるので、この設定の影響を受けるはずです。
    `post_max_size`はクライアントからのPOSTリクエストのボディデータの上限で、ファイルアップロードはPOSTのデータなので、この設定の影響を受けるはずです。
    `upload_max_filesize`はそのままですが、ファイルアップロードのファイルサイズ上限です。

    キャンセル

checkベストアンサー

+2

PHPのアップロード容量の上限の設定は3段構えになっている感じでちょっとわかりづらいかもしれません。

ざっくり言うと、

memory_limit >= post_max_size >= upload_max_filesize 

となるように設定しましょう、ということです。

20MBのアップロードを許容しようとすると、文字通りにupload_max_filesizeは当然20M(以上)となります。
post_max_sizeはPOSTリクエストの容量の上限を規定します。20Mのファイルアップロードを扱うためにはpost_max_sizeはupload_max_filesize以上必要になります。
PHPでそれらすべてを扱うためにメモリを確保しなくてはならないのでmemory_limitはpost_max_size以上必要、となります。

以下、ドキュメントからの引用です。

memory_limit integer
スクリプトが確保できる最大メモリをバイト数で指定します。この命令は、 正しく書かれていないスクリプトがサーバーのメモリを食いつぶすことを防止するのに役立ちます。 もし、使用可能メモリに制限を設けたくない場合は、 ここに -1 を指定してください。

post_max_size integer
POSTデータに許可される最大サイズを設定します。この設定は、ファイルアップロードにも影響します。大きなファイルをアップロード するには、この値を upload_max_filesize より大きく設定する必要があります。 一般的に memory_limit は、 post_max_sizeよりも大きく する必要があります。 integerを使用する際、 その値はバイト単位で測られます。 この FAQ に記載された 短縮表記を使用することも可能です。 POSTデータの大きさが、post_max_sizeより大きい場合、 $_POST と $_FILES superglobals は空になります。この事象は、いくつかの方法で検出することができます。 例えば、$_GET 変数をデータを <form action="edit.php?processed=1">のように 処理するスクリプトに渡し、 $_GET['processed'] が設定されているかどうかを 確認する方法があります。

upload_max_filesize integer
アップロードされるファイルの最大サイズ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

PHPへのPOSTのサイズ制限については、PHPコードが起動する前に判断されるので、PHPで書かれたini_set()へたどり着いた時にはもう手遅れです(そのコードに届くべきデータはすでに容量制限にかかった後です)。

.htaccessなど、PHP起動前に設定を変える手段を使うほかありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/24 21:25

    ご回答有り難うございます.
    .htaccessは利用できると思います.

    .htaccessについて調べてみたのですが,
    http://www.php-factory.net/trivia/05.php
    のようなページを見つけました.

    しかし,内容がイマイチわかりません.

    #メモリ使用量の上限
    php_value memory_limit 20M
    これは,一度に送信するバイト数ということでしょうか?

    #POSTデータの最大サイズ ※合計サイズ
    php_value post_max_size 20M
    これは……何でしょう?
    保存できる最大サイズ…?

    #1ファイルあたりの最大アップロードサイズ
    php_value upload_max_filesize 20M
    今回の場合,この値がキーになるのでしょうか?

    よろしくお願いいたします.

    キャンセル

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

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