蝸牛の歩み

蝸牛の如く,ゆっくりでも着実に前へ・・・

phpでファイルアップロードの進捗状況を表示する(AJAX)

昨日はMega Upload Progress Barを試したが、アップロードが遅くて使い物にならなかった。そこで、今日はAJAXを使ったファイルアップローダ「Uber Uploader」 - GIGAZINE経由でUber Uploaderを試してみることにした。Uber Uploaderでは、AJAXを使って画面遷移することなくアップロードし、プログレスバーで進捗状況を表示することができる。
Uber-Uploader_6.8.2.zip をダウンロード、解凍。INSTALL_AND_FAQ.HTMLを見ながら、インストールと設定を行う。

  1. "Perl with CGI, FILE::COPY, FILE::PATH, IO::File"が必要とのことなので、インストールされていなかったFile::Path、IO::FileをCPAN経由でインストール。
  2. ubr_upload.pl と ubr_ini.php の $TEMP_DIR を同じディレクトリに設定(デフォルトのまま)。
  3. ubr_default_config.php の $_CONFIG['upload_dir'] を変更。
  4. ubr_default_config.php の $_INI['redirect_url'] を変更。
  5. cgi-bin/ubr_upload.pl を /Library/WebServer/CGI-Executables/ にコピー。chmod 755。
  6. htmlディレクトリのファイルを、~/Sites/ にコピー。
  7. ブラウザで ubr_file_upload.php にアクセスし、アップロードのテストを行う。

なお、デフォルトではアップロードできるファイルが画像ファイル、動画ファイルなどに制限されているので、テストを行う際も注意。容量上限は5MB。TEMP_DIRやupload_dirは、勝手に作成されるので手動で作成しておく必要はない。

テストしたところ、「ERROR: Failed to find flength file」というエラーが発生し、プログレスバーが表示されない。このエラーについては、INSTALL_AND_FAQ.HTMLで解説されている。まずは、以下をチェックする。

  1. ubr_ini.php と ubr_upload.plで、$TEMP_DIRの設定が完全に同じか?→○
  2. ubr_upload.pl?aboutが動作するか?→○

スクリプトが適切に設定されている場合は、サーバー側の書き込みキャッシュの問題である可能性があるとのこと。3つ可能性が挙げられている中で、「OS X SERVER において "Performance Cache" が有効」に該当しているようだ。/etc/hostconfigのWEBPERFCACHESERVERを変更すればよいようだが、私の独断でおいそれとは設定を変えられない。ということで、Uber UploaderだけでなくPerlベースのスクリプトではダメかも知れない。

なお、アップロード自体は成功していた。アップロード速度は昨日と同じ3.5MBのファイルで約1分と、問題ない。ただ、ひょっとして"Performance Cache"のおかげだとすると、無効にしたときにこのスクリプトが使えるようになる代わりに激遅になる可能性も否定できない。