誰かがPHPでアップロードするためのプログレスバーを取得する方法を知っていますか?フォトアルバムアップローダーのコードを記述しようとしています。写真のアップロード中に進行状況バーを表示したいのですが。
私はphpが初めてなので、それについてすべてを知りません。
これは、(スクリプトを何時間もグーグルで試した後)圧倒的に簡単で、私が見つけた最も簡単で素晴らしいアップローダーです。
https://github.com/FineUploader/fine-uploader
APCやその他の外部PHPライブラリを必要とせず、共有ホストでファイルの進行状況のフィードバックを取得できます。また、html5のドラッグアンドドロップ(個人的にテストされていない)および複数のファイルアップロードをサポートしていると主張しています。
私の知る限り、純粋なPHPアップロードプログレスバー、またはPHPの仕組みが原因でPHP/Javascriptアップロードプログレスバーさえ使用できないと言ってすみません。最善の方法は、何らかの形式のFlashアップローダーを使用することです。
知るこれは、$ _ FILESを含むすべてのスーパーグローバルが読み込まれるまでスクリプトが実行されないためです。 PHPスクリプトが呼び出されるまでに、ファイルは完全にアップロードされます。
編集:これはもはや真実ではありません。 2010年でした。
APC がインストールされている場合、アップロードの進行状況のためのコールバックフックがあります。
Rasmus Lerdorf(PHPの作成者)には、YUIを使用した sample があります(ああ、ここに PHPソース )。
こちらのドキュメント をご覧ください。
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は、アップロードの進行中にのみ自然に機能し、フォームが送信されてブラウザが次のページにリロードされると、目に見える寿命を終了します。
アップロードプログレスバーの実装は簡単で、追加のPHP拡張機能、JavaScript、またはFlashは必要ありません。しかし、PHP 5.4以降が必要です。
session.upload_progress.enabled
でディレクティブ php.ini
をOn
に設定して、アップロードの進行状況情報の収集を有効にする必要があります。
次に、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
スーパーグローバル構造内に新しいキーを作成する必要があります。これには、アップロードステータス情報が入力されます。キーは、隠し入力の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/
楽しんで
Perlを使用してアップロードを行い、進行状況バーを表示するMega Upload( http://www.raditha.com/php/progress.php )を見つけました。
GearsとHTML5のHttpRequest
オブジェクトには、AJAX経由でファイルのアップロードを送信するためのprogressイベントがあります。
http://developer.mozilla.org/en/Using_files_from_web_applications
他の人がすでに答えている他のオプションは次のとおりです。
技術的には、YouTubeアップロードと同様の4番目のオプションがあり、GearsまたはHTML5では、ブロブを使用してファイルを小さなチャンクに分割し、各チャンクを個別にアップロードできます。各チャンクが完了すると、進行状況を更新できます。
HTML5には file upload api が導入されました。これにより、ファイルのアップロードの進行状況を監視できますが、古いブラウザには plupload があり、ファイルのアップロードを監視してそれらに関する情報を提供するために特別に作られたフレームワークがあります。さらに、多くのコールバックがあるため、すべてのブラウザーで機能します。
プログレスバーを作成するには、Javascriptを使用する必要があります。 Googleの簡単な検索でこの記事が表示されました: CSSを使用したWebAppersのシンプルなJavaScriptプログレスバー 。
Dojo File Upload Progress Bar Widget は、Dojo Javascriptフレームワークを使用する別のオプションです。
編集:大量の画像(フォトアルバムなど)をアップロードし、PHPスクリプトにPOSTする場合、javascriptを使用して、ポストから結果を読み取り、進行状況バーに基づいて更新できます。アップロードされた画像の数/画像の総数。これには、各投稿が完了した後にのみ更新するという副作用があります。 JSで投稿する方法に関する情報については、 こちら をご覧ください。
Php/ajaxプログレスバーを実行できます。 (PearのHtml_Ajaxライブラリをチェックアウトしてください)。ただし、これにはカスタムモジュールをphpにインストールする必要があります。
他の方法では、iframeを使用する必要があります。iframeを使用して、phpがファイルのアップロード量を確認します。ただし、この非表示のiframeは、悪意のあるデータをユーザーのコンピューターに送信するためによく使用されるため、一部のブラウザーアドオンによってブロックされる場合があります。
サーバーを制御できない場合は、何らかの方法でフラッシュプログレスバーを使用することをお勧めします。
フラッシュアップロードが仕事をします。必要な場所にファイルをアップロードします。しかし、私にはそれ以上の要求があります。アップロードが完了する前にファイル名を変更する必要があります。これはフラッシュソリューションでも可能ですが、FIXED変数を追加する場合のみです。ユーザーIDをファイル名に追加する必要がありますが、実行する方法がありません。