PHPによるファイルアップロード

やっててはまった点、困った点など。PHP マニュアル 第 38章ファイルアップロードの処理を補足する形で。

  • php.ini で post_max_size > upload_max_size にしておかないと、スクリプト自体が強制終了? して、$_FILES[...]['error'] を見てエラーメッセージを出せないので注意。
  • アップロード form において、hidden input の MAX_FILE_SIZE は type="file" な input より手前に書かないと適用されないので注意。
  • $_FILES[...]['size'] は実際にアップロードされたファイルのサイズ。本来送られるべきサイズではないので、アップロード中断の判断には使えない。
  • アップロード中断されたかどうかの判定はフォームの最後尾にダミーの input (name="dummy" とか)を入れておいて、$_POST['dummy'] がなければ中断されたと判断。
  • connection_aborted() で中断を判断できるかと思ったけどだめだった。
  • $_FILES[...]['error'] の UPLOAD_ERR_PARTIAL ってどんな時に出るの? これで中断を検出できるかと思ったらだめだった。
  • move_uploaded_file() は問答無用でファイルを上書きしてくる。ファイル名が必ず違うように工夫するか、適当にロックファイルを用意して排他制御する。

以下なんとかならないか調査中。無理っぽいけど。

  • ファイル転送される前にファイル名の確認とかできないものだろうか?
  • 転送中にプログレスバーみたいなの出せない?
  • 例えば100MB上限にしてそれより大きいファイルをアップすると延々100MB転送してからエラーが判明する。なんとかならんのか?