主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

PHPでファイルアップロードのプログレスバーを実装するには

最終更新日 2008-03-07 17:55:27 (1年以上前の記事です)

PHPでアップローダーを作るときに、プログレスバーをどうにか実装できるか調べたら、どうやらできるっぽかったので試してみた。
ちなみにできると言っても制約がいくつかあるみたい。まず第一に、 PHP 単体ではファイルのアップロード状況を把握したりすることはできない。そのため PECL APC エクステンションをインストールする必要がある。
また PHP のバージョンは 5.2 以上。 PECL APC エクステンションのバージョンは 3.0.13 以上。
そのため、うちの CentOS5 も FC6 もパッケージでは対応できなかった。

環境は以下の通り。
php-5.2.5
PECL APC-3.0.16

※追記
実はこの APC はスレッドセーフじゃないらしく、一つのアップロードが完了する前に次のアップロードが開始されると、現在進行中のキャッシュがクリアされるらしいので注意。

APC エクステンションのインストール

Apache と PHP はインストールされてるものとして、 APC エクステンションを追加する。

APC のダウンロード

まず最新の APC エクステンションを以下から取得する。
PECL :: Package :: APC

APC のコンパイルとインストール

次に以下のコマンドを実行してインストールする。
ただし、ここで apache の apxs のパスは /usr/sbin/apxs 、php-config のへパスは /usr/bin/php-config とする。
また、 php-devel パッケージがインストールされて無い場合はインストールする必要がある。

$ phpize
$ ./configure --enable-apc-mmap --with-apxs=/usr/sbin/apxs --with-php-config=/usr/bin/php-config
$ make
# make install

APC の設定

次に、 /etc/php.ini なり /etc/php.d/apc.ini なりを設定して APC を有効にする。

# vi /etc/php.ini
extension_dir = "/home/www/php/lib/php/extensions/no-debug-non-zts-20060613/"

extension=apc.so
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.apc.rfc1867=1

これで apache を再起動すれば APC が有効になるはず。

Upload 情報の取得

次に実際の php のコーディング。とりあえずどんなコードを書けば情報が取得できるかだけ書いておく。

HTML

まず form を含んだ HTML を作成する。まずコードから。

<form action="upload.php" method="post" enctype="multipart/form-data">
	<input type="hidden" name="APC_UPLOAD_PROGRESS" value="abcdefg" />
	<input type="file" name="upload_file" />
	<input type="submit" />
</form>

ここで重要なのは hidden で指定した APC_UPLOAD_PROGRESS 。ここに指定した value の値がサーバ上でファイルのアップロードの進捗状態を知るためのキーになる。このサンプルコードでは abcdefg をとりあえず指定してあるが、実際はランダム文字列を生成して設定するなどする。

PHP

次に PHP 。

$status = apc_fetch('upload_abcdefg');
var_dump($status);

この apc_fetch() っていう関数が PHP の Cache を確認するものらしい。
ここで指定した upload_ という suffix は upload 用の特別な値で、この値は php.ini で変更することもできる。

実際にこのようなコードを実行すると、現在進行中の upload 状況が確認できるはず。
あとは色々な方法でプログレスバーを作成すればいい。

実際のコードは気が向いたら作るけど、最近は .NET にはまってるので作らないかもしれない。

最終更新日 2008-03-07 17:55:27

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank2, rank3, rank7, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google