ホームページ バックエンド開発 PHPチュートリアル セッションと Javascript を使用して、PHP でファイル アップロードの進行状況バー機能を実装する方法を学びます。

セッションと Javascript を使用して、PHP でファイル アップロードの進行状況バー機能を実装する方法を学びます。

Jul 27, 2020 pm 04:51 PM
javascript php session

セッションと Javascript を使用して、PHP でファイル アップロードの進行状況バー機能を実装する方法を学びます。

Web アプリケーションでは、多くの場合、ファイル アップロード機能を提供する必要があります。一般的なシナリオには、ユーザー アバターのアップロード、アルバム写真のアップロードなどが含まれます。アップロードするファイルが比較的大きい場合は、アップロードの進行状況を示すプログレスバーを提供する必要があります。

PHP 5.4 より前では、このような進行状況バーを実装するのは簡単ではありませんでした。主に 3 つの方法がありました:

  • Flash、Java、ActiveX

    ## を使用する
  • #PHP の APC 拡張機能の使用

  • ##HTML5 のファイル API の使用
  • #関連学習の推奨事項:
  • PHP初心者からマスターまでのプログラミング

最初の方法は、サードパーティのブラウザ プラグインに依存しますが、汎用性が低く、セキュリティ リスクが発生しやすいです。ただし、Flash が広く使用されているため、解決策として Flash を使用する Web サイトは依然として多くあります。

2 番目の方法の欠点は、PHP の APC 拡張ライブラリのインストールが必要であり、ユーザーがサーバー側の構成を制御する必要があることです。さらに、アップロードの進行状況バーを実装するためだけに APC がインストールされている場合、それは明らかにやりすぎです。

3 番目の方法は、サーバー側のサポートを必要とせず、ブラウザ側の Javascript のみを使用する最も理想的な方法です。しかし、HTML5の標準規格がまだ確立されておらず、ブラウザメーカーごとにサポート状況が異なるため、この方法はまだ普及が難しいです。

PHP 5.4 で導入されたセッションベースのアップロード進行状況監視関数 (session.upload_progress) は、サーバー側のアップロード進行状況監視ソリューションを提供します。 PHP 5.4 にアップグレードした後は、APC 拡張機能をインストールする必要はなく、ネイティブ PHP とフロントエンド Javascript のみを使用してアップロード進行状況バーを実装できます。

PHP 5.4 の session.upload_progress 新機能を詳しく紹介しましょう。

原理の紹介

ブラウザがファイルをサーバーにアップロードすると、PHP はファイルの詳細情報 (アップロード時間、アップロードの進行状況など) をアップロードします。 ) はセッションに保存されます。その後、アップロードが進行するにつれて、セッション内の情報が定期的に更新されます。このようにして、ブラウザは Ajax を使用してサーバー側のスクリプトを定期的にリクエストし、スクリプトはセッションの進行状況情報を返します。ブラウザ側の Javascript はこの情報に基づいて進行状況バーを表示/更新できます。 それでは、ファイルのアップロード情報はどのように保存されるのでしょうか?どうやってアクセスするのでしょうか?以下で詳しく説明しましょう。

PHP 5.4 では、いくつかの設定項目 (php.ini で設定) が導入されました。

コードは次のとおりです。

session.upload_progress.enabled = "1"
session.upload_progress.cleanup = "1"
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
session.upload_progress.freq = "1%"
session.upload_progress.min_freq = "1"
ログイン後にコピー

enabled は、upload_progress 関数をオンにするかどうかを制御します。デフォルトの「有効」。クリーンアップは、ファイルのアップロード要求が送信された後にセッション関連の情報をクリアするかどうかを設定します。これはデフォルトで有効になっています。

プレフィックスと名前は、セッションに保存される進行状況情報の変数名/キー名を設定するために使用されます。これら 2 つのアイテムの詳細な使用方法については、以下を参照してください。

freq と min_freq は、サーバー側で進捗情報を更新する頻度を設定するために使用されます。これら 2 つの項目を適切に設定すると、サーバーの負荷を軽減できます。

ファイルをアップロードするためのフォームでは、このアップロードの識別子を設定し、この識別子を使用して後続のプロセスで進行状況情報を参照する必要があります。具体的には、アップロード フォームに非表示の入力が必要で、その name 属性は php.ini の session.upload_progress.name の値であり、その値は自分で定義した識別子です。次のように:

コードは次のとおりです:

<input type="hidden"
    name="<?php echo ini_get(&#39;session.upload_progress.name&#39;); ?>"
    value="test" />
ログイン後にコピー

ファイル アップロード フォームを受信した後、PHP は $_SESSION 変数に新しいキーを作成します。キー名はセッションの値です。 Upload_progress.prefix と上記 カスタム識別子を連結した後に得られる文字列は次のように取得できます:

コードは次のとおりです:

$name = ini_get(&#39;session.upload_progress.name&#39;);
$key = ini_get(&#39;session.upload_progress.prefix&#39;) . $_POST[$name];
$_SESSION[$key]; // 这里就是此次文件上传的进度信息了
ログイン後にコピー

$_SESSION[$key]

この変数の構造は次のようになります:

コードは次のとおりです:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$_SESSION[&quot;upload_progress_test&quot;] = array( &quot;start_time&quot; =&gt; 1234567890, // 开始时间 &quot;content_length&quot; =&gt; 57343257, // POST请求的总数据长度 &quot;bytes_processed&quot; =&gt; 453489, // 已收到的数据长度 &quot;done&quot; =&gt; false, // 请求是否完成 true表示完成,false未完成 // 单个文件的信息 &quot;files&quot; =&gt; array( 0 =&gt; array( ... ), // 同一请求中可包含多个文件 1 =&gt; array( ... ), ) );</pre><div class="contentsignin">ログイン後にコピー</div></div>このようにして、content_length と bytes_processed の 2 つの項目を使用して、進行状況のパーセンテージを取得できます。

プログラム例

原則を紹介したので、PHP と Javascript に基づいてファイル アップロードの進行状況バーを完全に実装してみましょう。

アップロード フォーム

まず、アップロード フォーム ページのindex.phpを作成します。コードは次のとおりです。

コードは次のとおりです。次のとおりです:

<form id="upload-form"
    action="upload.php" method="POST" enctype="multipart/form-data"
    style="margin:15px 0" target="hidden_iframe">
        <input type="hidden" name="" value="test" />
        <p><input type="file" name="file1" /></p> 
        <p><input type="submit" value="Upload" /></p>
</form>    
<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;"></iframe>
<p id="progress" class="progress" style="margin-bottom:15px;display:none;">
        <p class="bar" style="width:0%;"></p>
        <p class="label">0%</p>
</p>
ログイン後にコピー

フォーム内の非表示項目 session.upload_progress.name に注目してください。値は test に設定されています。フォームにはファイル アップロードの入力が 1 つだけありますが、必要に応じて複数追加できます。

フォームの target 属性に特別な注意を払う必要があります。ここでの設定は、現在のページの iframe を指しています。これは重要で、target 属性を設定することで、フォーム送信後のページが iframe 内に表示され、現在のページへのジャンプを回避できます。現在のページに進行状況バーを表示する必要があるためです。

#progress

この p は、進行状況バーを表示するために使用されます。

注: session_start() をindex.php の先頭に追加することを忘れないでください。

アップロードされたファイルの処理

フォームのアクションは、upload.php をポイントしており、upload.php でアップロードされたファイルを処理し、現在のディレクトリに転送します。ここでは通常のアップロード処理と変わりません。

代码如下:

if(is_uploaded_file($_FILES[&#39;file1&#39;][&#39;tmp_name&#39;])){
        move_uploaded_file($_FILES[&#39;file1&#39;][&#39;tmp_name&#39;], "./{$_FILES[&#39;file1&#39;][&#39;name&#39;]}");
}
?>
ログイン後にコピー

Ajax获取进度信息

这一步是关键,我们需要建立一个 progress.php 文件,用来读取session中的进度信息; 然后我们在 index.php 中增加Javascript代码,向 progress.php 发起Ajax请求,然后根据获得的进度信息更新进度条。

progress.php 的代码如下:

代码如下:

session_start();
$i = ini_get(&#39;session.upload_progress.name&#39;);
$key = ini_get("session.upload_progress.prefix") . $_GET[$i];
if (!empty($_SESSION[$key])) {
        $current = $_SESSION[$key]["bytes_processed"];
        $total = $_SESSION[$key]["content_length"];
        echo $current < $total ? ceil($current / $total * 100) : 100;
}else{
        echo 100;
}
?>
ログイン後にコピー

在这里我们获得$_SESSION变量中的进度信息,然后输出一个进度百分比。

在 index.php 中,我们将如下代码添加到页面底部 (为简便,这里使用jQuery):

代码如下:

function fetch_progress(){
        $.get(&#39;progress.php&#39;,{ &#39;&#39; : &#39;test&#39;}, function(data){
                var progress = parseInt(data);
                $(&#39;#progress .label&#39;).html(progress + &#39;%&#39;);
                $(&#39;#progress .bar&#39;).css(&#39;width&#39;, progress + &#39;%&#39;);
                if(progress < 100){
                        setTimeout(&#39;fetch_progress()&#39;, 100);
                }else{
            $(&#39;#progress .label&#39;).html(&#39;完成!&#39;);
        }
        }, &#39;html&#39;);
}
$(&#39;#upload-form&#39;).submit(function(){
        $(&#39;#progress&#39;).show();
        setTimeout(&#39;fetch_progress()&#39;, 100);
});
ログイン後にコピー


当#upload-form被提交时,我们把进度条显示出来,然后反复调用 fetch_progress() 获得进度信息,并更新进度条,直到文件上传完毕,显示'完成!'。

注意事项

input标签的位置

name为session.upload_progress.name的input标签一定要放在文件input 的前面。

取消上传

通过设置 $_SESSION[$key]['cancel_upload'] = true 可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除。

setTimeout vs. setInterval

应该通过 setTimeout() 来调用 fetch_progress(),这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval() 则不能保证这一点,有可能导致进度条出现'不进反退'。

以上がセッションと Javascript を使用して、PHP でファイル アップロードの進行状況バー機能を実装する方法を学びます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles