PHPでアップロードするためのプログレスバーを取得する方法を知っている人はいますか?フォトアルバムアップローダーのコードを書こうとしています。写真のアップロード中にプログレスバーを表示したいのですが。
私はphpにかなり慣れていないので、それについてすべてを知っているわけではありません。
回答:
これは(何時間もグーグルでスクリプトを試した後)セットアップが最も簡単で、私が見つけた中で最も優れたアップローダーです。
https://github.com/FineUploader/fine-uploader
APCやその他の外部PHPライブラリは必要ありません。共有ホストでファイルの進行状況のフィードバックを得ることができ、html5のドラッグアンドドロップ(個人的にはテストされていません)と複数のファイルのアップロードをサポートすると主張しています。
申し訳ありませんが、私の知る限り、純粋なPHPアップロードプログレスバー、またはPHPの動作のためにPHP / Javascriptアップロードプログレスバーでさえ不可能です。最善の策は、何らかの形式のFlashアップローダーを使用することです。
AFAIKこれは、$ _ FILESを含むすべてのスーパーグローバルにデータが入力されるまでスクリプトが実行されないためです。PHPスクリプトが呼び出されるまでに、ファイルは完全にアップロードされます。
編集:これはもはや真実ではありません。2010年でした。
私にとってうまく機能した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拡張機能、JavaScript、またはFlashは必要ありません。ただし、PHP5.4以降が必要ですです。
ディレクティブsession.upload_progress.enabled
をOn
に設定して、アップロードの進行状況情報の収集を有効にする必要があります。php.ini
ます。
次に、他のファイル入力の直前に、HTMLアップロードフォームに非表示の入力を追加します。name
その非表示の入力のHTML属性は、session.upload_progress.name
fromのディレクティブの値と同じである必要があります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
、アップロードステータス情報が入力されるスーパーグローバル構造に新しいキーを作成する必要があります。キーは連結されname
、value
隠された入力。
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/
楽しんで
HTML5では、ファイルアップロードの進行状況を監視できるファイルアップロードAPIが導入されましたが、古いブラウザの場合は、ファイルアップロードを監視し、それらに関する情報を提供するために特別に作成されたフレームワークがpluploadにあります。さらに、コールバックがたくさんあるので、すべてのブラウザで機能します
GearsとHTML5には、HttpRequest
AJAXを介してファイルのアップロードを送信するためのprogressイベントがオブジェクトにあります。
http://developer.mozilla.org/en/Using_files_from_web_applications
他の人がすでに答えている他のオプションは次のとおりです。
技術的には、YouTubeアップロードと同様に4番目のオプションがあります。GearsまたはHTML5では、blobを使用してファイルを小さなチャンクに分割し、各チャンクを個別にアップロードできます。各チャンクが完了すると、進行状況を更新できます。
プログレスバーを作成するには、Javascriptを使用する必要があります。簡単なGoogle検索でこの記事にたどり着きました:WebAppers Simple Javascript Progress Bar withCSS。
Dojoファイルアップロードプログレスバーウィジェットは、DojoJavascriptフレームワークを使用するもう1つのオプションです。
編集:多数の画像(フォトアルバムなど)をアップロードし、それらをPHPスクリプトにPOSTすると、javascriptを使用して投稿から結果を読み戻し、アップロードされた画像の数に基づいてプログレスバーを更新できます。 /画像の総数。これには、各投稿が完了した後にのみ更新するという副作用があります。JSで投稿する方法については、こちらをご覧ください。
php / ajaxプログレスバーを実行できます。(梨のHtml_Ajaxライブラリをチェックアウトしてください)。ただし、これにはカスタムモジュールをphpにインストールする必要があります。
他の方法では、iframeを使用する必要があります。これにより、phpはファイルのアップロード量を確認します。ただし、この非表示のiframeは、悪意のあるデータをユーザーのコンピューターに送信するためによく使用されるため、一部のブラウザーアドオンによってブロックされる可能性があります。
サーバーを制御できない場合は、何らかの形のフラッシュプログレスバーを使用するのが最善の策です。