downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

セッションとセキュリティ> <カスタムセッションハンドラ
[edit] Last updated: Fri, 25 May 2012

view this page in

セッションのアップロード状況

INI オプション session.upload_progress.enabled を有効にすると、アップロード中の個々のファイルの進捗状況を PHP で追えるようになります。 この情報は、アップロードのリクエスト自体にとっては特に有用ではありませんが、 ファイルのアップロード中にアプリケーションから別のエンドポイントに POST リクエストを (XHR などで) 送って状態をチェックできるようになります。

アップロードの状況は、アップロードの処理中にスーパーグローバル $_SESSION で取得できます。また、 INI オプション session.upload_progress.name で設定した名前でも POST されます。PHP 側では、この POST リクエストを検出すると $_SESSION 内の配列に値を格納します。配列のインデックスは、INI オプション session.upload_progress.prefixsession.upload_progress.name の値をつなげたものです。つまり、これらの INI 設定を読んで次のようにキーを取得することになります。

<?php
$key 
ini_get("session.upload_progress.prefix") . ini_get("session.upload-progress.name");
var_dump($_SESSION[$key]);
?>

現在進行中のファイルアップロードをキャンセルすることもできます。 キャンセルするには、$_SESSION[$key]["cancel_upload"]TRUE を設定します。複数のファイルをひとつのリクエストでアップロードしている場合は、 これでキャンセルできるのは現在進行中のアップロードとそれ以降にアップロードする予定だったファイルだけです。 既にアップロードが完了したファイルは削除されません。この方法でアップロードをキャンセルした場合、 $_FILES 配列のキー errorUPLOAD_ERR_EXTENSION が設定されます。

INI オプション session.upload_progress.freq および session.upload_progress.min_freq で、アップロードの進捗状況を再計算する頻度を制御します。 これらを適切に設定すれば、進捗状況の取得によるオーバーヘッドはほぼ無視できる程度になります。

例1 情報の例

アップロード進捗状況の配列の構造を示す例です。

<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="submit" />
</form>

セッションに格納されるデータは、このようになります。

<?php
$_SESSION
["upload_progress_123"] = array(
 
"start_time" => 1234567890,   // リクエストされた時刻
 
"content_length" => 57343257// POST されたコンテンツの長さ
 
"bytes_processed" => 453489,  // 受信して処理済みのバイト数
 
"done" => false,              // POST ハンドラが (正常かどうかにかかわらず) 完了した場合に true
 
"files" => array(
  
=> array(
   
"field_name" => "file1",       // <input/> フィールドの name
   // 次の 3 つの要素は $_FILES と同じ内容です
   
"name" => "foo.avi",
   
"tmp_name" => "/tmp/phpxxxxxx",
   
"error" => 0,
   
"done" => true,                // POST ハンドラがこのファイルの処理を終えたときに true
   
"start_time" => 1234567890,    // このファイルの処理が始まった時刻
   
"bytes_processed" => 57343250// このファイルにおける、受信して処理済みのバイト数
  
),
  
// 同じリクエスト内で、まだアップロードが完了していない別のファイル
  
=> array(
   
"field_name" => "file2",
   
"name" => "bar.avi",
   
"tmp_name" => NULL,
   
"error" => 0,
   
"done" => false,
   
"start_time" => 1234567899,
   
"bytes_processed" => 54554,
  ),
 )
);



add a note add a note User Contributed Notes セッションのアップロード状況
wojbach at o2 dot pl 05-Mar-2012 12:41
"session.upload-progress.name" -> whether here shouldn't be a underscore instead of a dash
powtac at gmx dot de 02-Mar-2012 08:35
takeone 02-Dec-2011 07:12
IE6 does not inherit session when you launch new browser from start menu or shortcut.It's the feature.
It is recommended that upload form and progress bar are on same window.
gerd dot randolf at web dot de 09-Nov-2011 07:29
Note that this will be available from PHP 5.4 on. It won't work in PHP 5.3 or earlier.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites