PHPでプログレスバーをアップロードする


82

PHPでアップロードするためのプログレスバーを取得する方法を知っている人はいますか?フォトアルバムアップローダーのコードを書こうとしています。写真のアップロード中にプログレスバーを表示したいのですが。

私はphpにかなり慣れていないので、それについてすべてを知っているわけではありません。


回答:


70

これは(何時間もグーグルでスクリプトを試した後)セットアップが最も簡単で、私が見つけた中で最も優れたアップローダーです。

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

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


11
代わりにこれを使用したいと思うでしょう:github.com/valums/file-uploader-同じ作者。
Michael Reed

6
また、ファイルアップロードの進行状況をすぐに取得するためにPHPが提供するセッションアップロードの進行状況を参照してください。
hakre 2011年

7
@jpeskinそれは開発者にとってちょっと不公平です。あなたが「彼らに支払うことを申し出る」という理由だけで、ある種の売春婦のように彼らにあなたのために仕事をする義務を負わせるわけではありません。デバッグ方法がわからない場合は、自分以外の人に指を向けるようなことはしません。インターネットで見つけたソフトウェアは「現状のまま」提供されるので、他の人をバッシングしないでください。助けようとするだけです。
sucitivel 2012年

3
@sucitivel詳細:私は支払いを申し出て彼は受け入れました、それから私たちは私たちが見たすべてのバグを文書化するためにトラブルを経験しました、そして彼はすべての電子メール(単に礼儀正しいもの、ステータスの更新を要求し、彼はまだ仕事に興味を持っていました)。お金のために働く義務のある人はいないと思います。これは、開発者の可用性やフリーランスの仕事への関心について知りたいと思うかもしれない他の人にとっての単なる観察データポイントでした。プロジェクトはフォークされたので、開発者が維持することに興味を失っていると感じたのは私だけではありませんでした。
jpeskin 2012年

5
blueimp.github.com/jQuery-File-Upload-これは本当にうまく機能します。Ubuntu =)の下で遅れていないので、少なくとも私はそれが好きです
BeRocket 2012年

13

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

Rasmus Lerdorf(PHPの作成者)は、YUIを使用したこのサンプルを持っています(ああ、これがPHPソースです)。

こちらのドキュメントを参照してください


同じまたはphpソースリンクのどちらももう機能しません..代替リンクがありますか?
supersan 2016年

@supersanこの回答は非常に古くなっています。APCは廃止され、Session UploadAPIは別のものになりました。サーバーがFastCGIを使用している場合も機能しません...最近のセキュリティ上の理由からほとんど機能しています。
パワーロード2016年

12

申し訳ありませんが、私の知る限り、純粋なPHPアップロードプログレスバー、またはPHPの動作のためにPHP / Javascriptアップロードプログレスバーでさえ不可能です。最善の策は、何らかの形式のFlashアップローダーを使用することです。

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

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


13
なぜ3つの反対票があるのですか?それは真実であり、彼らは完全に不当です。ネイティブPHPで実行され、追加の拡張機能/ Apacheモジュール/ perlスクリプト/その他のものを必要としないプログレスバーを誰かに見せてもらおうと思います。
ペッカ

1
さて、それは2011年であり、HTML5のおかげで可能になりました。ここで最初の応答を参照してください:stackoverflow.com/questions/76976/...
Zarel

10
ええと、それは2012年であり、XMLHttpRequestを介したHTML5でのファイルのアップロードは、まだすべての主要なブラウザーで利用できるわけではありません。
ダミアンB

3
@Pekka웃それは真実ではありません。APCがインストールされている場合(そしてインストールする必要がある場合)、PHPで完全にネイティブに実行でき、JavaScriptもインストールできません。
アリエル

2
@Pekka웃PHP> = 5.4のセッション情報を使用したアップロードは言うまでもありません。
wookie88 2013年

8

私にとってうまく機能したPHP風(5.2+)とフラッシュなしの方法の1つ:

まず、「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は、当然、アップロードの進行中にのみ機能し、フォームが送信されてブラウザが次のページにリロードされると、表示されている期間が終了します。


PHPで$ _FILESなしでファイルをアップロードするにはどうすればよいですか

4

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

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

次に、他のファイル入力の直前、HTMLアップロードフォームに非表示の入力を追加します。nameその非表示の入力のHTML属性は、session.upload_progress.namefromのディレクティブの値と同じである必要があります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のマニュアルを参照してください。


2

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

  • その無料(BSDライセンス)
  • 国際化可能
  • クロスブラウザ準拠
  • APCをインストールするかどうかを選択できます(プログレスバーを確定するVSプログレスバーを確定する)
  • dojoテンプレートメカニズムを使用するため、カスタマイズ可能な外観。あなたはあなたのcssに従ってteテンプレートにあなたのクラス/ IDを追加することができます

楽しんで



2

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

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

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

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

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


1

プログレスバーを作成するには、Javascriptを使用する必要があります。簡単なGoogle検索でこの記事にたどり着きましたWebAppers Simple Javascript Progress Bar withCSS

Dojoファイルアップロードプログレスバーウィジェットは、DojoJavascriptフレームワークを使用するもう1つのオプションです。

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


6
-1 Javascriptプログレスバーは素晴らしいですが、私が見る限り、ファイルのアップロードとは何の関係もありません。また、DojoアップロードプログレスバーはPHPへのインターフェイスを提供していません。もちろん間違っている場合は訂正してください。
ペッカ

1

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

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

サーバーを制御できない場合は、何らかの形のフラッシュプログレスバーを使用するのが最善の策です。


一部のアドオンはiframeをブロックする可能性がありますが、ブラウザはどうでしょうか。例を挙げていただけますか?
ya23 2010年

「ajaxphpfile upload」という用語をグーグルで検索すると、上位5つの結果のうち4つがすべてiframeを使用して返されます(5番目がiframeを使用しているかどうかはわかりません(ページが読み込まれません))。各サイトの例をご覧ください。
Ali Lown 2010年

確かに、彼らはiframeを使用していますが、どのような場合でもブロックできることは言及していません。それとも私はそれを逃したことがありますか?
ya23 2010年

申し訳ありませんが、あなたが尋ねようとしていたことを読み間違えました。いいえ、iframeを直接ブロックするブラウザの例を示すことはできません。iframeをブロックするnoscriptなど、人々が使用するアドオンについて考えていました。将来の参照のために投稿のテキストを更新しました。
Ali Lown 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.