【问题标题】:Drag and drop zone in JS - File inputJS中的拖放区域-文件输入
【发布时间】:2015-05-30 20:06:32
【问题描述】:

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

我得到的表格是这样的:

Name
LastName
Email
Phone number
Interests
Files

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

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

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

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

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

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

我还可以一次添加更多我在此处描述的内容: https://stackoverflow.com/questions/30499388/dropzone-js-into-another-form

【问题讨论】:

    标签: javascript jquery html servlets


    【解决方案1】:

    我认为这个例子对你有帮助。 此应用程序允许将文件拖放到灰色区域(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>

    【讨论】:

    • 它对我有用,但问题是,当我提交表单时,文件没有随它一起提交。如何将它们作为添加到常规文件输入的文件发送?
    • 我不是很擅长 JS,我必须添加这个功能但我不知道怎么做
    • @arienn 看到这个post。我认为这会有所帮助
    • 我复制/粘贴了您的代码,但我添加到此 dropzone 的文件在提交时并未与我的表单一起发送,我无法弄清楚原因。当我使用我提供的代码时,它们与你一起发送,一切正常,但文件没有发送,我的 servlet 没有任何东西可以捕获和保存:(
    • 我发现了这个动态添加文件到表单的示例。 Sample
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2014-02-05
    相关资源
    最近更新 更多