web-dev-qa-db-ja.com

PHPに進捗バーをアップロードします

誰かがPHPでアップロードするためのプログレスバーを取得する方法を知っていますか?フォトアルバムアップローダーのコードを記述しようとしています。写真のアップロード中に進行状況バーを表示したいのですが。

私はphpが初めてなので、それについてすべてを知りません。

79
Josh Curren

これは、(スクリプトを何時間もグーグルで試した後)圧倒的に簡単で、私が見つけた最も簡単で素晴らしいアップローダーです。

https://github.com/FineUploader/fine-uploader

APCやその他の外部PHPライブラリを必要とせず、共有ホストでファイルの進行状況のフィードバックを取得できます。また、html5のドラッグアンドドロップ(個人的にテストされていない)および複数のファイルアップロードをサポートしていると主張しています。

70
Jesse

私の知る限り、純粋なPHPアップロードプログレスバー、またはPHPの仕組みが原因でPHP/Javascriptアップロードプログレスバーさえ使用できないと言ってすみません。最善の方法は、何らかの形式のFlashアップローダーを使用することです。

知るこれは、$ _ FILESを含むすべてのスーパーグローバルが読み込まれるまでスクリプトが実行されないためです。 PHPスクリプトが呼び出されるまでに、ファイルは完全にアップロードされます。

編集:これはもはや真実ではありません。 2010年でした。

13
Macha

APC がインストールされている場合、アップロードの進行状況のためのコールバックフックがあります。

Rasmus Lerdorf(PHPの作成者)には、YUIを使用した sample があります(ああ、ここに PHPソース )。

こちらのドキュメント をご覧ください。

13
Powerlord

PHPらしい(5.2+)&Flashを使用しない方法がうまく機能しました。

最初に、「 this 」「uploadprogress」拡張機能を起動して実行する方法を説明した投稿を参照してください。

次に、ファイルのアップロード元のフォームを含むページで、次のiframeを作成します。

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

次に、このコードを「送信」ボタンに追加します。

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"

これで、フォームに非表示のiframeが表示され、「送信」をクリックしてファイルのアップロードを開始すると、uploadprogress.phpの内容が表示されます。 $ upload_idは、フォームの非表示フィールド「UPLOAD_IDENTIFIER」の値として使用しているものと同じでなければなりません。

Uploadprogress.php自体は次のようになります(必要に応じて修正および調整します)。

<html>
<head>
<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'>
</head>
<body>
Upload progress:<br />
<?php
    if(!$_GET['id']) die;
    $info = uploadprogress_get_info($_GET['id']);
    $kbytes_total = round($info['bytes_total'] / 1024);
    $kbytes_uploaded = round($info['bytes_uploaded'] / 1024);
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB';
?>
</body>
</html>

は毎秒セルフリフレッシュされることに注意してください。必要に応じて、ニースの視覚的な進行状況バーをここに確実に追加できます(異なる色の2つのネストされた<div>など)。アップロードが進行中のiframeは、アップロードの進行中にのみ自然に機能し、フォームが送信されてブラウザが次のページにリロードされると、目に見える寿命を終了します。

8
IvarsK

アップロードプログレスバーの実装は簡単で、追加のPHP拡張機能、JavaScript、またはFlashは必要ありません。しかし、PHP 5.4以降が必要です

session.upload_progress.enabledでディレクティブ php.iniOnに設定して、アップロードの進行状況情報の収集を有効にする必要があります。

次に、HTMLアップロードフォームに非表示の入力を追加しますbeforeその他のファイル入力。その非表示入力のHTML属性nameは、session.upload_progress.nameからのディレクティブ php.ini の値と同じである必要があります(最終的には session.upload_progress.prefix ) 。 value属性はユーザー次第であり、セッションキーの一部として使用されます。

HTMLフォームは次のようになります。

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

このフォームを送信すると、PHPは$_SESSIONスーパーグローバル構造内に新しいキーを作成する必要があります。これには、アップロードステータス情報が入力されます。キーは、隠し入力のnamevalueを連結します。

PHPで、読み込まれたアップロード情報を確認できます。

var_dump($_SESSION[
    ini_get('session.upload_progress.prefix')
   .ini_get('session.upload_progress.name')
   .'_myupload'
]);

出力は次のようになります。

$_SESSION["upload_progress_myupload"] = array(
  "start_time" => 1234567890,   // The request time
  "content_length" => 57343257, // POST content length
  "bytes_processed" => 54321,   // Amount of bytes received and processed
  "done" => false,              // true when the POST handler has finished, successfully or not
  "files" => array(
    0 => array(
      "field_name" => "file1",    // Name of the <input /> field
      // The following 3 elements equals those in $_FILES
      "name" => "filename.ext",
      "tmp_name" => "/tmp/phpxxxxxx",
      "error" => 0,
      "done" => false,            // True when the POST handler has finished handling this file
      "start_time" => 1234567890, // When this file has started to be processed
      "bytes_processed" => 54321, // Number of bytes received and processed for this file
    )
  )
);

進行状況バーを作成するために必要なすべての情報があります。アップロードがまだ進行中の場合、合計で転送されるバイト数、すでに転送されたバイト数の情報があります。

アップロードの進行状況をユーザーに提示するには、アップロード中のスクリプトとは別のPHPスクリプトを作成します。これにより、セッション内のアップロード情報のみが表示され、たとえばJSON形式で返されます。このスクリプトは、AJAXとユーザーに提示される情報を使用して、たとえば1秒ごとに定期的に呼び出すことができます。

$_SESSION[$key]['cancel_upload']trueに設定することで、アップロードをキャンセルすることもできます。

詳細情報、追加設定、およびユーザーのコメントについては、 PHPマニュアル を参照してください。

別のアップローダーフルJS: http://developers.sirika.com/mfu/

  • その無料(BSDライセンス)
  • 国際化可能
  • クロスブラウザに準拠
  • aPCをインストールするかしないかを選択できます(プログレスバーを決定しないVSプログレスバーを決定する)
  • Dojoテンプレートメカニズムを使用するカスタマイズ可能な外観。あなたのCSSに応じてTEテンプレートにクラス/ IDを追加できます

楽しんで

2
Valdelievre

Perlを使用してアップロードを行い、進行状況バーを表示するMega Upload( http://www.raditha.com/php/progress.php )を見つけました。

2
Josh Curren

GearsとHTML5のHttpRequestオブジェクトには、AJAX経由でファイルのアップロードを送信するためのprogressイベントがあります。

http://developer.mozilla.org/en/Using_files_from_web_applications

他の人がすでに答えている他のオプションは次のとおりです。

  1. Flashベースのアップローダー。
  2. Javaベースのアップローダー。
  3. 2番目の comet-style 受信したデータのサイズを報告するWebサーバーまたはスクリプトへの要求。 Lighttpdのような一部のWebサーバーは、外部スクリプトまたはプロセスを呼び出すオーバーヘッドを節約するために、このインプロセスを実行するモジュールを提供します。

技術的には、YouTubeアップロードと同様の4番目のオプションがあり、GearsまたはHTML5では、ブロブを使用してファイルを小さなチャンクに分割し、各チャンクを個別にアップロードできます。各チャンクが完了すると、進行状況を更新できます。

2
Steve-o

HTML5には file upload api が導入されました。これにより、ファイルのアップロードの進行状況を監視できますが、古いブラウザには plupload があり、ファイルのアップロードを監視してそれらに関する情報を提供するために特別に作られたフレームワークがあります。さらに、多くのコールバックがあるため、すべてのブラウザーで機能します。

2
the master

プログレスバーを作成するには、Javascriptを使用する必要があります。 Googleの簡単な検索でこの記事が表示されました: CSSを使用したWebAppersのシンプルなJavaScriptプログレスバー

Dojo File Upload Progress Bar Widget は、Dojo Javascriptフレームワークを使用する別のオプションです。

編集:大量の画像(フォトアルバムなど)をアップロードし、PHPスクリプトにPOSTする場合、javascriptを使用して、ポストから結果を読み取り、進行状況バーに基づいて更新できます。アップロードされた画像の数/画像の総数。これには、各投稿が完了した後にのみ更新するという副作用があります。 JSで投稿する方法に関する情報については、 こちら をご覧ください。

1
Joey Robert

Php/ajaxプログレスバーを実行できます。 (PearのHtml_Ajaxライブラリをチェックアウトしてください)。ただし、これにはカスタムモジュールをphpにインストールする必要があります。

他の方法では、iframeを使用する必要があります。iframeを使用して、phpがファイルのアップロード量を確認します。ただし、この非表示のiframeは、悪意のあるデータをユーザーのコンピューターに送信するためによく使用されるため、一部のブラウザーアドオンによってブロックされる場合があります。

サーバーを制御できない場合は、何らかの方法でフラッシュプログレスバーを使用することをお勧めします。

1
Ali Lown

フラッシュアップロードが仕事をします。必要な場所にファイルをアップロードします。しかし、私にはそれ以上の要求があります。アップロードが完了する前にファイル名を変更する必要があります。これはフラッシュソリューションでも可能ですが、FIXED変数を追加する場合のみです。ユーザーIDをファイル名に追加する必要がありますが、実行する方法がありません。

0
nibuster