PHPのアップロード進捗状況を表示する

ファイルのアップロードがどのくらい完了しているか表示するというのを
やった人がいるらしい。

Asynchronous file upload with AJAX progress bar in PHP

で、実際にどんなことをしてるのか見てみると
肝心なとこが…あれ?perl?

なんでもPHPだとスクリプトが実行されるのが
アップロードが完了した後なので、アップロード中に
そのファイルの情報を取得できないらしい。

ここに/tmpディレクトリを監視することで
どのファイルがアップロードされるか調べるというアイディアを
出してる人がいた。
でもこの方法だと、アップロードしていることがわかっても
誰がどのファイルをアップロードしているのかが分からないため
あまり意味がないらしい。

で、ちょっと考えたのが、JavaScriptを使って一度に
1つのファイルしかアップロードできなくするという方法。
これなら誰がアップロードしてるのか分かると思う。

具体的には、onsubmitのときに、先にサーバーへファイルを
アップロードすることを通知する。
すると、サーバーは排他処理を開始し、ファイルを
アップロードするスクリプトとは別のスクリプトを実行する。
このスクリプトで/tmpディレクトリの現在の状態を取得する。
その後、onsubmitにtrueを返すことでファイルのアップロードを実行する。
そしてすぐにサーバーへアップロードを開始したことを通知する。
この通知を受けて、サーバーは現在の/tmpディレクトリの状態と
以前の状態を比較してどのファイルがアップロードされている
一時ファイルなのか調べ、排他処理を終了する。
あとはそのファイルのサイズを一定時間ごとに取得すれば
アップロードの進捗状況が分かるかも。
もしonsubmitの段階で別の人がアップロードしている場合、
その人の排他処理が終了するまでonsubmit内で待つ。

排他処理を行う部分はアップロード前の通知とアップロード後の
通知の間だけにすればたぶん、そんなにロックしている時間は短いと思う。
また、ファイルサイズに関わらず、この時間というのは大体一定と思う。
それでも1分間に数百アップロードとかだときついかもしれないけど
そこまでシビアな環境ならもっとちゃんとした方法を取った方がいいはず。
ただ、回線のすごく遅い人がアップロードして、この排他処理の間の通信に
ものすごく時間がかかってしまうと、他の人がみんな待ち状態になってしまう。
あと、この待つ順番も下手すると順番を飛ばされる可能性もでてくるので
少し工夫する必要があると思う。

ここに書いたことはまだアイディアの段階で試していないので
実際にやってなにか問題が起こっても責任は取れません。

とここまで書いて、そもそもデフォルトでは2MBまでしか
アップロードできないんだから、今どきの高速回線なら
それくらい待たせてもいいよなと思ったとか思わなかったとか。


posted by oi at 2006年05月23日 23:31 | Comment(0) | TrackBack(0) | Ajax
この記事へのコメント

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。