Web 開発者を何年も悩ませてきた問題は、ファイルアップロードの進行状況バーなどのリアルタイム情報をアプリケーションに追加する方法です。ユーザーはせっかちで、ブラウザが何かをしている間、ブラウザがフリーズしたのではないか、接続が遅いのではないかと考えながら座って待ちたくありません。進行状況インジケーターは、ユーザーに有益な情報を提供し、何が起こっているのかを正確に知らせるために提供されます。
これを実現したいと最初に考えられるのは、まずユーザーのコンピュータからファイルのサイズを取得し、次にファイルがアップロードされるディレクトリがあるサーバー上で簡単な計算を実行することによって、簡単に実行できます。 2 番目の考えについては、物事はそれほど単純ではないことがわかります。
JavaScript はファイルの名前、タイプ、さらにはネイティブ画像の幅と高さにアクセスできますが、ファイルのサイズにアクセスできるようになったのは HTML5 になってからです。残念ながら、HTML5 はまだ完全な標準ではなく、すべてのブラウザーに均等に分散されています。別の解決策は、Flash、Java、または ActiveX プラグインに依存することです。いいえ、パスします。ただし、別の解決策は、オプションの PHP キャッシュ拡張機能をインストールすることですが、ホスティング環境によっては、これは非常に小さな作業であり、過剰な作業であるように思えるかもしれません。
すべてのオプションが煩わしいものでいっぱいで、その作業はすぐに頭の痛いものになってしまったように思えます。しかし、ヨーダの言葉を借りれば、「いいえ、それはもう一つです
」。
私が PHP を愛する多くの理由の 1 つは、一見難しいタスクを簡単に実行できることです。 PHP 5.4 では、別の新しい構成命令セット session.upload_progress が作成されました。
この記事では、この機能を使用して、外部ライブラリやブラウザーに依存せずに単純なアップロード進行状況バーを作成する方法を説明します。最初にその仕組みについて説明し、次にタスク (フォーム、JavaScript、CSS をアップロードし、アップロード ステータスとファイルを返す) を完了するために作成する 4 つのファイルについて説明します。
セッションアップロードの進行状況
ファイルのアップロードを許可するための一般的な要件に加えて、進行状況を追跡するための 2 つの要件があります。 session.upload_progress.enabled ディレクティブが有効になっている必要があり、Web フォームで指定する名前には session.upload_progress.name ディレクティブに非表示フィールドが含まれている必要があります。 session.upload_progress.enabled が true (PHP 5.4 のデフォルトと同様、おそらくそれ以降) の場合、アップロードは $_POST [session.upload_progress.name] 中に送信され、ファイル転送情報は $_SESSION スーパーグローバル配列内にあります。
ファイル転送中の $_SESSION 配列の print_r() の出力は次のようになります:
Array
(
[upload_progress_myForm] => Array
(
[start_time] => 1323733740
[content_length] => 721127769
[bytes_processed] => 263178326
[done] =>
[files] => Array
(
[0] => Array
(
[field_name] => userfile
[name] => ubuntu-10.04.3-desktop-i386.iso
[tmp_name] =>
[error] => 0
[done] =>
[start_time] => 1323733740
[bytes_processed] => 263178026
)
)
)
)
当您正在开发本地或快速网络上传小文件,你不会是能够直观地观察到的进展,因为转让发生如此之快。在这种情况下,你可能想尝试传送一个大文件。确保在你的php.ini的设置文件允许上传大,具体的post_max_size 的upload_max_filesize指令,然后确认他们是理智的价值,当你去生产。
创建表单
我会提出的第一个文件上传表单。只是为了保持尽可能简单的事情,例如将张贴到自己,一次只能处理一个文件上传。此外,我不会打扰保存文件后,它已上载。
下面是代码form.php:
01
02
if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_FILES["userfile"])) {
03
// move_uploaded_file()
04
}
05
?>
06
07