输入类型FILE multiple - 按顺序添加文件

Jak*_*čář 2 html javascript jquery input

当访问者打开对话框并通过输入类型文件多次上传文件时,我正在开发一个页面(一次性使用 - 它的注册页面).一切正常,但我的客户刚刚告诉我他们希望能够从不同的目录上传多个文件.通过多次打开该对话框.

现在,通常情况是,当我再次打开文件选择对话框时,先前选择的文件已从输入中删除.

有没有办法(纯HTML或JS)我可以添加"堆叠"文件的可能性 - 将它们添加到选择(可能是一些JS对象后来转换回输入类型文件?),以便可以将文件添加到列表中输入中的文件?

Gre*_* D. 5

我想说你有两种选择.

坚持经典形式

如果要保留经典表单逻辑,则必须添加更多文件输入以保留旧选择.一个简短的脚本将如下所示:

$('input[type="file"]').on('change', function() { $(this).append('<input type="file" name="file[]"/>') });
Run Code Online (Sandbox Code Playgroud)

因此,要添加更多文件,用户可以单击下一个文件输入.然后,您可以对其进行增强,使设计内容更好,并删除功能.

HTML5的方式

虽然之前的想法很简单,但我认为它缺乏设计和用户友好性.所以另一个想法是更先进的方式,这将需要更多的工作,但会让你做你想要的和更多(你可以添加拖放).

所以基本的想法是,当用户选择一个文件时,你将获得Javascript中的文件,你可以使用FileReader对象来完成.拥有文件内容后,您只需将其排入变量即可.

var queue = [];

function addFile(event) {
    var files = event.target.files, i = 0, j = files.length, file, reader;

    reader = new FileReader();
    reader.onloadend = function () {
        queue.push{ reader.result };
    };

    for (i = 0; i < j; i += 1) {
        file = files[i];
        reader.readAsBinaryString(file);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要保留选择对话框,则需要保留文件输入.

一旦您的用户对表单有效,您应该首先通过Ajax发送您的其他输入(您希望保留在页面上,或者您必须将文件存储在localStorage中,我认为这是一个坏主意).然后你必须使用Ajax请求将文件发送到服务器,只需将文件位发送到服务器即可.在您的服务器上,您将不得不获取这些位并将其简单地放在一个文件上(如果您有一个特定的服务器部分语言,我们可以扩展它的工作方式).

你可以进一步这样做,有可能获得上传的进度,取消上传,如果你有大小限制切片你的文件,拖放,...

当然,你会考虑到某些浏览器对这个对象有一些问题,但它往往在各处都很好.


S. *_*ose 5

请注意 Gregoire 给出的“经典形式”/JQuery 解决方案:这不适用于新添加的输入,因为侦听器对它们不活动。如果您修改它以使用委托事件,您将拥有一个有效的干净解决方案:

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

$("#files").on("change", "input", function(event){
    $('#files').append('<input type="file" name="file[]"/>')
});
Run Code Online (Sandbox Code Playgroud)