ホームページ > ウェブフロントエンド > jsチュートリアル > JS 再開可能ファイルのアップロード実装チュートリアル

JS 再開可能ファイルのアップロード実装チュートリアル

Guanhui
リリース: 2021-05-31 15:19:57
転載
3744 人が閲覧しました

JS 再開可能ファイルのアップロード実装チュートリアル

私が初めてフロントエンド開発を学び始めたとき、ファイルのアップロードで問題が発生しました。また、中断したポイントからアップロードを再開できるようにしたいと思いました。多くの情報を確認した結果、H5 のファイル API はまさに私たちのニーズを満たしていることがわかりましたが、いくつかの問題も発生したため、同じニーズを持つ友人に役立つように記録しました。

1. まず、ファイル オブジェクトを導入するには、H5 ページにファイル タイプの入力タグを配置する必要があります。

1

<input type="file" onchange="fileInfo()">

ログイン後にコピー

ファイルを選択した後にファイル関連情報を表示します:

1

2

3

4

function fileInfo() {

  let fileObj = document.getElementById(&#39;file&#39;).files[0];

  console.log(fileObj);

}

ログイン後にコピー

取得したオブジェクト自体は配列です。ここでは 1 つのファイルのみが選択されています。複数のファイルを選択する必要がある場合は、次のファイルを追加できますこれらは input タグの複数の属性に含めます。ここでブラウザ コンソールを開くと、ファイルの最終変更時刻、ファイル サイズ、ファイル名が出力されていることがわかります。

2. さて、次のメッセージが表示されたら、ファイル オブジェクトを選択した後、ファイルをサーバーにアップロードする必要があります。アップロードするフォーム イベントをシミュレートできます。FormData オブジェクトを導入する必要があります。次に、ファイルのアップロード サイズに関する HTTP 制限のため、アップロードする必要があります。ファイルをチャンクに分割し、サーバー上でファイルを受信します。その後、ブロックが結合されて全体になり、最後にアップロードの進行状況を示すプログレス バーが必要になります。アイデアを明確にした後、実装を開始します。

最初に H5 ページに進行状況バーを配置し、同時にファイル変更を選択するイベントをファイル ブロックをアップロードする関数アップロードに置き換えます (開始)アップロード バイト)、ここでは 0 番目のバイト、つまり先頭からアップロードを開始します:


次に、ファイル ブロック アップロード関数を実装します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

// 文件切块大小为1MB

const chunkSize = 1024 * 1024;

 

// 从start字节处开始上传

function upload(start) {

  let fileObj = document.getElementById(&#39;file&#39;).files[0];

  // 上传完成

  if (start >= fileObj.size) {

    return;

  }

  // 获取文件块的终止字节

  let end = (start + chunkSize > fileObj.size) ? fileObj.size : (start + chunkSize);

  // 将文件切块上传

  let fd = new FormData();

  fd.append(&#39;file&#39;, fileObj.slice(start, end));

  // POST表单数据

  let xhr = new XMLHttpRequest();

  xhr.open(&#39;post&#39;, &#39;upload.php&#39;, true);

  xhr.onload = function() {

    if (this.readyState == 4 && this.status == 200) {

      // 上传一块完成后修改进度条信息,然后上传下一块

      let progress = document.getElementById(&#39;progress&#39;);

      progress.max = fileObj.size;

      progress.value = end;

      upload(end);

    }

  }

  xhr.send(fd);

}

ログイン後にコピー

ここでは、ネイティブ JS を使用してサーバーにリクエストを送信し、関数スライス (開始位置、終了位置) を使用してファイルを分割し、ファイル ブロックを FormData オブジェクトにカプセル化してシミュレートします。フォームのファイルアップロード。バックグラウンドでは、PHP を使用してデータを受信します。他のバックエンド言語も使用できます。

1

2

3

4

5

<?php

  // 追加文件块

  $fileName = $_FILES[&#39;file&#39;][&#39;name&#39;];

  file_put_contents(&#39;files/&#39; . $fileName, file_get_contents($_FILES[&#39;file&#39;][&#39;tmp_name&#39;]), FILE_APPEND);

?>

ログイン後にコピー

ここでは、新しいフォルダー ファイルを作成し、アップロードされたファイルをここに保存します。取得されたファイル ブロックの内容は、追加 FILE_APPEND の形式になります。そこで、ブラウザを開いてファイルをアップロードします。

# 次に、vscode.exe ファイルがファイル フォルダーに受信されているかどうかを確認します。

3. ファイルアップロード機能では、ブレークポイント再開機能を実装する必要があります。前の手順でファイルを切り取ったことに基づいて、アップロードの再開は非常に簡単になります。ネットワークが突然切断されたり、ブラウザが予期せず終了したりすると、不完全なファイルがアップロードされます。ファイルを選択した後、サーバーに問い合わせるだけで済みます。サイズサーバー上の同じファイル名のファイルをアップロードし、アップロード開始位置 (バイト) を次のサイズに設定します。

最初に初期化関数を定義し、ファイルを選択した後、アップロードされたファイルのサイズをサーバーに問い合わせます。 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 初始化上传大小

function init() {

  let fileObj = document.getElementById(&#39;file&#39;).files[0];

  let xhr = new XMLHttpRequest();

  xhr.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      // 将字符串转化为整数

      let start = parseInt(this.responseText);

      // 设置进度条

      let progress = document.getElementById(&#39;progress&#39;);

      progress.max = fileObj.size;

      progress.value = start;

      // 开始上传

      upload(start);

    }

  }

  xhr.open(&#39;post&#39;, &#39;fileSize.php&#39;, true);

  // 向服务器发送文件名查询大小

  xhr.send(fileObj.name);

}

ログイン後にコピー

サーバー側で fileSize.php を使用して、アップロードされたファイル サイズをクエリします:

1

2

3

4

5

6

7

8

9

10

11

<?php

  // 接收文件名

  $fileName = file_get_contents(&#39;php://input&#39;);

  $fileSize = 0;

  $path = &#39;files/&#39; . $fileName;

  //查询已上传文件大小

  if (file_exists($path)) {

    $fileSize = filesize($path);

  }

  echo $fileSize;

?>

ログイン後にコピー

最後に、H5 ページの input タグの onchange イベントを init() に変更します:

1

<input type="file" onchange="init()">

ログイン後にコピー

同時に関数をアップロードします。プログレスバーの最大値を繰り返し設定する必要はありません。次のように変更します。

// プログレスバーの情報を変更します。ブロックをアップロードしてから、次のブロックをアップロードします


document.getElementById('progress').value = 終了;


アップロード(終了);

次に、ブラウザを開き、アップロード プロセス中に意図的にブラウザを閉じます。次回同じファイルを選択すると、最初のファイルからアップロードを再開できます。ブレークポイントの位置。

4. ブレークポイントで再開できるファイルアップロード機能は実装されましたが、インターフェースの美化はまだ必要です ここではブートストラップフレームワークを引用していますが、これには jquery が必要です ちなみに jquery の ajax を使用していますネイティブ JS の ajax ではなく、注意が必要です。最も重要なことは、$.ajax の processData プロパティと contentType プロパティを false に設定する必要があることです:

1

2

3

4

5

6

7

8

9

10

11

// POST表单数据

$.ajax({

  url: &#39;upload.php&#39;,

  type: &#39;post&#39;,

  data: fd,

  processData: false,

  contentType: false,

  success: function() {

    upload(end);

  }

});

ログイン後にコピー
最終的な美化レンダリングは次のとおりです:

推奨チュートリアル:「

JS チュートリアル >>

以上がJS 再開可能ファイルのアップロード実装チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
ノード Js + JS 入力 = document.getElementById
から 1970-01-01 08:00:00
0
0
0
js addClassが機能しない
から 1970-01-01 08:00:00
0
0
0
javascript - jsコードをPythonに変換
から 1970-01-01 08:00:00
0
0
0
jsファイルのコードが見つかりません
から 1970-01-01 08:00:00
0
0
0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート