Вместо использования встроенного ввода используйте метку со скрытым вводом внутри, вам также нужно будет обрабатывать файлы из события изменения вручную, вместо использования сериализации в форме, вы создадите new FormData()
и добавите файлы кэто наряду с любыми другими данными.
var Files = [];
$(document).ready(()=>{
$('input#files').on('change', (e)=>{
let files = e.target.files;
for(let i = 0; i < files.length; i++){
let file = files[i];
let div = document.createElement('div');
div.id = Files.length;
$(div).append(`${file.name} <span class="delete-file" data-id="${Files.length}">X</span>`);
$('div.files-container').append(div);
Files.push(file);
updateLabel();
}
});
$(document).on('click', 'span.delete-file', function(e){
let id = $(this).data('id');
$(this).parent().remove();
Files.splice(id, 1);
updateLabel();
});
});
function updateLabel() {
let text = 'Select Files';
if(Files.length > 1) text = `${Files.length} Files`;
else if(Files.length > 0) text = `${Files.length} File`;
$('#files-count').html(text);
}
label.custom-input{
display: inline-block;
border: 1px solid black;
padding: 5px;
border-radius: 5px;
cursor: pointer;
min-width: 150px;
}
label.custom-input input{
display: none;
}
.files-container{
display: flex;
flex-direction: column;
padding: 5px;
}
.files-container div{
padding: 5px;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2px;
border-bottom: 1px solid;
}
span.delete-file{
padding: 5px;
color: white;
background-color: red;
cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="files" class="custom-input">
<input id="files" type="file" multiple>
<span id="files-count">Select Files</span>
</label>
<div class="files-container">
</div>