inputタグでのファイルアップロードでファイル追加アップロードを可能にする方法

inputタグでのファイルアップロードでファイル追加アップロードを可能にする方法

htmlでは複数ファイルのアップロードは下記のようなコードで実現することができます。

<input name="files[]" type="file" multiple="multiple" id="test" />

しかし、これでは一度アップロードを完了し、もう一度アップロードボタンを押すと、一度目にアップロードしていたファイルは消えてしまいます。

以下のような形です

・1回目のアップロード後の状態

ファイルを2つアップロードします。

・2回目のアップロード後の状態

2回目では、ファイルを3つアップロードします。

これを1回目の2ファイルを残しつつ追加で3ファイルアップロードして最終的に5ファイルにしたいことってないですかね。

本記事では、一度目にアップロードしたファイルを残しつつ、さらに追加でアップロードできるようにする方法を記載します。

完成形サンプル

<!DOCTYPE html>
<html lang="ja">
 <head>
 <meta charset="utf-8">
 <title>サンプル</title>
 <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
 </head>
 <body>
   <input name="files[]" type="file" multiple="multiple" id="test" />
 </body>
 <script>
  var fileList = [];
  $('input#test').change(function() {
           var testfile = document.getElementById("test");
           var files = $(this).prop('files');
           const dt = new DataTransfer();

           for(var i = 0; i < fileList.length; i++ ){
              dt.items.add(fileList[i]);
           }
           for(var i = 0; i < files.length; i++){
               dt.items.add(files[i]);
               fileList.push(files[i]);
           }
           testfile.files = dt.files;
  });



  </script>

</html>

完成形のブラウザ動作

1度目のアップロード後の状態

2ファイルをアップロードしています。

ファイルが2ファイルアップロードできていることがわかります。

2度目のアップロード後の状態

1ファイル追加でアップロードします。

アップロードされたファイルが3つになっていることがわかります。

説明

  1. はじめに、一度アップロードしたものを格納しておくリストを定義します
var fileList = [];

inputタグでのアップロードはアップロードボタンを押した瞬間に前にアップロードしたものは削除されてしまうので、アップロードするたびにこの変数に格納しておきます。

2. 次にinputタグにアクセスします。

var testfile = document.getElementById("test");

3. 次に、inputタグにファイルオブジェクトを追加するためには、一旦、DataTransferというものにfileオブジェクトを格納する必要があります。

const dt = new DataTransfer();

4. 下記のコードで今までfileList変数に蓄積してきたファイルオブジェクトをDataTransferの変数に格納します。

for(var i = 0; i < fileList.length; i++ ){
              dt.items.add(fileList[i]);
 }

5. 下記のコードで今回アップロード分のファイルもDataTransferの変数に格納します。

ここでは、今回分は次回アップロード時に利用できるようにfileList変数に追加しておきます。

for(var i = 0; i < files.length; i++){
               dt.items.add(files[i]);
               fileList.push(files[i]);
 }

6. 最後にinputタグへファイルオブジェクトを追加します。

testfile.files = dt.files;

以上です。試してみてください。

javascriptカテゴリの最新記事