JS中的拖放区-文件输入

Drag and drop zone in JS - File input

我在使用现有表单上传文件时遇到问题。 我正在寻找的是可以添加多个文件(最多 5 个)的脚本,您可以一次添加一到五个文件。如果你一个一个添加,我需要它来添加新的,而不是替换以前的。

我的表格看起来像这样:

Name
LastName
Email
Phone number
Interests
Files

文件名是这样创建的:name+lastname+phonenumber+filename

然后我将每个文件的路径添加到数据库中 - 这已经完成,我只需要良好的拖放区域。

我需要它来显示添加的文件名并可以从队列中删除添加的文件。

但是我不想在添加文件时上传文件。我希望在提交整个表单时上传它,以便可以创建文件名并添加数据库路径。

谁能给我提供好的脚本,或者基于我之前提到的两个主题的脚本,让它可以做我想做的事?

我能够一个一个地添加 5 个文件,我在这里进行了描述: HTML Add multiple file to the input

我还可以一次添加更多我在这里描述的内容:

我认为这个例子对你有帮助。 此应用程序允许将文件拖放到灰色区域(1 或 5) 如果单击文件名,它会从列表中删除文件。

function init() {
    //get dragdrop element
    var dd = document.getElementById("dragdrop");
    //get files element
    $files = document.getElementById("files");
    dd.ondragover = stop;
    dd.ondragleave = stop;
    if ('FileReader' in window) {
        document.ondrop = dragAccept;
    }

    //get form
    var $form = document.querySelector("form");
    //catch on submit
    $form.onsubmit = function (e) {
        stop(e);
        var fd = new FormData();
        //apend files to FormData
        for (var i in files){
            var file = files[i].file;
            var filename = file.name;
            var name = "file";
            fd.append(name, file, filename);
        };
        //append inputs to FormData
        var $inputs = $form.querySelectorAll("input");
        for (var i = 0; i < $inputs.length; i++) {
            var $input = $inputs[i];
            fd.append($input.getAttribute("name"), $input.value);
        }
        //Send data
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/echo/html/', true);
        xhr.send(fd)
    }
}

function stop(e) {
    e.stopPropagation();
    e.preventDefault();
}

function dragAccept(e) {
    stop(e);
    if (e.dataTransfer.files.length > 0)
        for (var i = 0; i < e.dataTransfer.files.length; i++) {
            addFile(e.dataTransfer.files[i]);
        }
}

//file list store
var files = {};
// html element of file list
var $files = null;
//add file to file list
function addFile(file) {
    //add files with diferent name, max files count 5
    if (!(file.name in files) && Object.keys(files).length < 5) {
        var div = createFile(file.name);
        $files.appendChild(div);
        files[file.name] = {
            file: file,
            element: div
        }
    }
}

//create html element with file name
function createFile(name) {
    var div = document.createElement("div");
    div.innerText = name;
    var input = document.createElement("input")
    //remove on click
    div.addEventListener("click", function () {
        $files.removeChild(this);
        delete files[name];
    })
    return div;
}


window.addEventListener("load", init);
<form method="post" enctype="multipart/form-data" action="">
    <label>Name<input name="name" /></label>
    <label>Last name<input name="lastName" /></label>
    <label>Email<input name="email" /></label>
    <div id="dragdrop" style="width: 300px; height: 300px; background-color:lightgray">Drag drop zone</div>
    <div id="files"></div>
    <button type="submit">Send</button>
</form>