1

In my application, I have one input file which lists the selected files below it. each selected file has a button to remove, I need to remove that specific file when clicking the button. but I find it hard, I could remove a single file but when it comes to multiple files it's hard for me to delete. please someone help me with this. thank you.

input field:

<div class="form-group mb-3">
                    <div class="custom-file">
                        <input
                            type="file"
                            class="custom-file-input"
                            id="referenceLetters"
                            name="referenceLetters[]"
                            aria-describedby="inputGroupFileAddon01"
                            onchange="updateReferenceList()"
                            multiple="multiple"
                            accept=".doc,.docx,.pdf"
                        />
                        <label class="custom-file-label" for="referenceLetters">Choose file</label>
                    </div>
                </div>
                <div id="selectedRefereceLetters">
                </div>

by this function listing the selected files:

function updateReferenceList() {
        var ref_input = document.getElementById('referenceLetters');
        var ref_output = document.getElementById('selectedRefereceLetters');
        var ref_children = "";
        for (var i = 0; i < ref_input.files.length; ++i) {
            ref_children += '<ul class="mb-2 file-preview">' +
                                    '<li class="d-flex align-items-center pb-2">'+
                                        '<button id="deleteRef" style="background: transparent; border: none !important; font-size:0;"><i class="ri-close-line mr-2"></i></button>'+
                                        '<i class="ri-file-text-line mr-2 text-gray-400 text-5xl"></i>'+
                                        '<div class="file">'+
                                            '<h4>'+ref_input.files.item(i).name+'</h4>'+
                                        '</div>'+
                                    '</li>'+
                                '</ul>';
        }

        ref_output.innerHTML = ref_children;

        $('#referenceLetters').closest('.form-group').removeClass('has-error');
        $('#referenceLetters-error').remove();
    }

when the user clicks the button with id deleteRef I need that specific file to be removed. how can I achieve this?

using the below method I could remove the selected single file which is not a multiple file input

$("body").on("click","#deletecv",function(){ 
        $("#cv").val('');
        updateCVList();
        return false;
    }); 

I guess a method to change filelist object to an array and remove the items from the array, but still, I don't know to implement it.

anonymous
  • 11
  • 6

2 Answers2

0

I think you can do something like this but i wasnt try it :) :

  • create array of deletedFiles with javascript
  • when button click add file name to the array
  • then send array with ajax to server
  • and if file['name'] is in deletedFiles array continue.
0

I could solve this issue by using the data transfer object in javascript and below is the method.

function updateReferenceList() {
        var ref_input = document.getElementById('referenceLetters');
        var ref_output = document.getElementById('selectedRefereceLetters');
        var ref_children = "";
        for (var i = 0; i < ref_input.files.length; ++i) {
            ref_children += '<div id="ref'+i+'"><ul class="mb-2 file-preview" >' +
                                    '<li class="d-flex align-items-center pb-2">'+
                                        '<button onclick="delRef('+i+')" class="deleteRef" style="background: transparent; border: none !important; font-size:0;"><i class="ri-close-line mr-2"></i></button>'+
                                        '<i class="ri-file-text-line mr-2 text-gray-400 text-5xl"></i>'+
                                        '<div class="file">'+
                                            '<h4>'+ref_input.files.item(i).name+'</h4>'+
                                        '</div>'+
                                    '</li>'+
                                '</ul></div>';
        }

        ref_output.innerHTML = ref_children;

        $('#referenceLetters').closest('.form-group').removeClass('has-error');
        $('#referenceLetters-error').remove();
    }

function delRef(index) {
        var dt = new DataTransfer()
        var input = document.getElementById('referenceLetters')
        var { files } = input
        for (var i = 0; i < files.length; i++) {
            var file = files[i]
            if (index !== i) dt.items.add(file) 
            input.files = dt.files
        }
        updateReferenceList();
    }
anonymous
  • 11
  • 6