Ajax アップロード ファイルの共有の例 Codular

小云云
リリース: 2023-03-18 14:06:02
オリジナル
1506 人が閲覧しました

現在、人々は Web ページを閲覧中に、Web ページから離れることなく他のことを行うことを好みます。これは、通常、Ajax を使用して実現されますが、ブラウザーの進歩により、それは使用されなくなりました。はい、この記事では主に Ajax アップロード ファイル プログレス バー Codular の関連情報を紹介します。必要な方はぜひ参考にしてください。

ここでは、ページを離れることなくファイルをサーバーにアップロードする方法を説明します。前の記事で使用したものと同じバックエンド PHP コードを使用します。スクリプトは、アップロードの進行状況を表示しながらファイルをサーバーにアップロードします。最後に、アップロードされたファイルのリンク アドレスを返したり、その他のアプリケーション情報を返したりすることもできます。 注: このコードは、ie10 以降のみをサポートしています。

コードを書いてみましょう

まず HTML 構造、次に JavaScript、そして PHP コードを示します。この部分は前のチュートリアルから改変されています。PHP コードについてはあまり説明しません。 。

HTML

2 つの入力ボックスを使用するだけで済みます。1 つはファイル タイプ ファイルで、もう 1 つは単なるボタン ボタンであり、ファイル アップロード リクエストを送信するためにクリックされるのをリッスンできます。 また、アップロードのステータスを強調表示するために幅を変更する p もあります。

以下に示すように:


<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS File Upload with Progress</title>
  <style>
  .container {
    width: 500px;
    margin: 0 auto;
  }
  .progress_outer {
    border: 1px solid #000;
  }
  .progress {
    width: 20%;
    background: #DEDEDE;
    height: 20px; 
  }
  </style>
</head>
<body>
  <p class=&#39;container&#39;>
    <p>
      Select File: <input type=&#39;file&#39; id=&#39;_file&#39;> <input type=&#39;button&#39; id=&#39;_submit&#39; value=&#39;Upload!&#39;>
    </p>
    <p class=&#39;progress_outer&#39;>
      <p id=&#39;_progress&#39; class=&#39;progress&#39;></p>
    </p>
  </p>
  <script src=&#39;upload.js&#39;></script>
</body>
</html>
ログイン後にコピー

小さな進行状況バーのスタイルを記述し、ファイルのアップロードと進行状況バーの表示を処理するスクリプト ファイルを下部に追加したことがわかります。

JavaScript

まず、使用するタグを取得します。タグはすでに ID でタグ付けされています


var _submit = document.getElementById(&#39;_submit&#39;), 
_file = document.getElementById(&#39;_file&#39;), 
_progress = document.getElementById(&#39;_progress&#39;);
ログイン後にコピー

次に、クリック イベントを _submit に追加して、選択したファイルをアップロードします。これを行うには、addEventListener メソッドを使用します。ボタンをクリックします 最後に、アップロード メソッドを呼び出します


これで、アップロードの処理を続行できます。次の手順があります:

  1. 選択したファイルを確認します

  2. ファイル データを動的に作成します。送信される

  3. Pass jsはXMLHttpRequestを作成します

  4. ファイルをアップロードします

選択したファイルを確認します

ファイル入力box_fileには、選択したファイルキューをクエリするためのパラメータファイルがあります - 複数のパラメータを設定した場合、複数のファイルを選択できます。配列の長さが 0 より大きい場合は続行し、そうでない場合は直接戻ります。


_submit.addEventListener(&#39;click&#39;, upload);
ログイン後にコピー

これで、ファイルが選択されたと仮定します。ファイルがあることを覚えておいてください。配列のインデックスは 0 から始まります。

送信するファイル データを動的に作成します

このために、FormData を使用してデータをそれに結合する必要があります。ステップ 3 で生成されたリクエストに FormData を送信します。使用する append メソッドは、最初のパラメーターは入力ボックスの name 属性に似ており、2 番目のパラメーターは選択した最初のファイルに値を設定します。 .


if(_file.files.length === 0){
  return;
}
ログイン後にコピー

いつ 後でサーバーにデータを送信するときに使用します

アップロードスクリプトを通じてXMLHttpRequestを作成します

この部分は非常に基本的なもので、コールバック関数を定義するための新しいXMLHttpRequest,并设置一些设置。首先我们将修改onreadystatechange値を作成します。リクエストのステータスが変化したとき。このメソッドは、状態が変化したときにreadyStateをチェックして、値が希望どおりであることを確認します。この場合は4で、リクエストが完了したことを意味します。

2番目のステップでは、を追加します。このようにして、アップロードの進行状況を取得して進行状況バーを更新できます。リクエストが成功したら、try...catch を使用して戻り値を解析するプロセスをラップします。解析が失敗した場合は、独自の戻り値オブジェクトを作成して、コードはエラーを報告できません。ここでは、戻り値をコンソールに出力するだけです。プログレスバーを処理します:


var data = new FormData();
data.append(&#39;SelectedFile&#39;, _file.files[0]);
ログイン後にコピー

ここでは少し複雑ですが、イベントを監視します。このイベントオブジェクトには、より重要な 2 つの属性があります。loaded と total.loaded は、にアップロードされた値を表します。 total は送信される合計値を表します。これら 2 つの値に基づいてパーセンテージを計算して、プログレス バーの幅を設定できます。

注: ここではアニメーション効果は追加されていませんが、カスタマイズできます。ニーズに応じたアニメーション効果。

ファイルのアップロード

これで、リクエストを送信できるようになりました。POST 経由で、upload.php ファイルというファイルにリクエストを作成し、パラメーター データを指定して send() メソッドを使用します。データを送信できます:

var request = new XMLHttpRequest();
request.onreadystatechange = function(){
  if(request.readyState == 4){
    try {
      var resp = JSON.parse(request.response);
    } catch (e){
      var resp = {
        status: &#39;error&#39;,
        data: &#39;Unknown error occurred: [&#39; + request.responseText + &#39;]&#39;
      };
    }
    console.log(resp.status + &#39;: &#39; + resp.data);
  }
};
ログイン後にコピー
完全な JavaScript コードを以下に示します:

request.upload.addEventListener(&#39;progress&#39;, function(e){
  _progress.style.width = Math.ceil(e.loaded/e.total) * 100 + &#39;%&#39;;
}, false);
ログイン後にコピー

ここで PHP を見てみましょう...

PHP


これは私たちが使用するコードです。いくつかの違いに気づくでしょう。主に、トップの JSON メソッドを使用して値を返し、それを JSON 形式で出力します。この PHP は前の記事のコードと同じです。つまり、このメソッドは 500Kb 未満の PNG 画像にのみ適用されます。成功メッセージは、アップロードされたファイルのパスを返します:

<?php
// Output JSON
function outputJSON($msg, $status = &#39;error&#39;){
  header(&#39;Content-Type: application/json&#39;);
  die(json_encode(array(
    &#39;data&#39; => $msg,
    &#39;status&#39; => $status
  )));
}
// Check for errors
if($_FILES[&#39;SelectedFile&#39;][&#39;error&#39;] > 0){
  outputJSON(&#39;An error ocurred when uploading.&#39;);
}
if(!getimagesize($_FILES[&#39;SelectedFile&#39;][&#39;tmp_name&#39;])){
  outputJSON(&#39;Please ensure you are uploading an image.&#39;);
}
// Check filetype
if($_FILES[&#39;SelectedFile&#39;][&#39;type&#39;] != &#39;image/png&#39;){
  outputJSON(&#39;Unsupported filetype uploaded.&#39;);
}
// Check filesize
if($_FILES[&#39;SelectedFile&#39;][&#39;size&#39;] > 500000){
  outputJSON(&#39;File uploaded exceeds maximum upload size.&#39;);
}
// Check if the file exists
if(file_exists(&#39;upload/&#39; . $_FILES[&#39;SelectedFile&#39;][&#39;name&#39;])){
  outputJSON(&#39;File with that name already exists.&#39;);
}
// Upload file
if(!move_uploaded_file($_FILES[&#39;SelectedFile&#39;][&#39;tmp_name&#39;], &#39;upload/&#39; . $_FILES[&#39;SelectedFile&#39;][&#39;name&#39;])){
  outputJSON(&#39;Error uploading file - check destination is writeable.&#39;);
}
// Success!
outputJSON(&#39;File uploaded successfully to "&#39; . &#39;upload/&#39; . $_FILES[&#39;SelectedFile&#39;][&#39;name&#39;] . &#39;".&#39;, &#39;success&#39;);
ログイン後にコピー

如果将所有内容都放在一起,您应该可以将文件上传到您期望的位置,并在浏览器的控制台内成功返回。

结束语

还有一些比较容易而又有效的方式来增强用户体验.通过将文件队列的多个文件加入到FormData,可以实现多文件上传. 有一点要说明,如果你是在本地做测试,你可能没办法看到进度条逐步变化,这取决于你本地机器的上传速度,我建议在服务器上使用较大的png文件做测试.

相关推荐:

PHP利用APC模块实现上传进度条的实例分享

实例讲解Ajax实现简单带百分比进度条

JavaScript控制进度条的实例分析

以上がAjax アップロード ファイルの共有の例 Codularの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!