jquery 将HTML文件对象从一个< input type = file>传递到另一个[重复]

ha5z0ras  于 2023-10-17  发布在  jQuery
关注(0)|答案(4)|浏览(103)

这个问题已经有答案了

How to set File objects and length property at FileList object where the files are also reflected at FormData object?(1个答案)
20小时前关闭。
我想实现一个多文件上传的形式,其中我想要的文件,以便用户可以排序的文件的优先级(我使用可拖动和排序的Jquery工具)。
因此,我添加了一个多文件输入:

<input type = "file" multiple>

现在,当我选择一些文件,它显示说3个文件选定。但是当我选择3个文件时,我希望将文件上传器分成3部分,以便用户可以相应地设置优先级排序。
为此,我使用了以下类型的代码:

$('.files').change(function(e){
var filesSelected = e.target.files;
if(filesSelected.length > 1){ //if user selects multiple files, then automatically split the files into multiple divs so that he/she may do the ordering of files
    //Here I want to create a list of  all the files and implement the draggable and sortable thing.
}
});

现在的情况是,我不能拆分FileList的对象数组,并将每个对象分配给另一个输入。
希望我清楚我的疑问和问题是可以理解的,因为这是我第一次在任何这样的论坛发帖。

tzdcorbm

tzdcorbm1#

不能以编程方式设置<input type="file">的值。这将是一个主要的安全流程。想象一下,一些网站自动从您的计算机上传任意文件。

jdg4fx2g

jdg4fx2g2#

您可以尝试遍历选定的文件,然后使用jQuery动态创建一个div,其中包含来自文件的数据,如下所示

$('.files').change(function(e){
var filesSelected = e.target.files;
if(filesSelected.length > 1){ 
   for(var i=0;i<filesSelected.length;i++) { // We iterate through the selected Files
      $("#idFromParentElement").append('<div> id=File'+i+'</div'); // Then we create and append the new div to the parent element of our choice
      var fileId = 'File'+i;
      $("#fileId").data("file",filesSelected[i]); //After that we include a data into the div with the selected file.
   }
}
});
v8wbuo2f

v8wbuo2f3#

从我收到的帖子和简短的讨论中,很明显,以编程方式设置文件值将构成安全威胁,因此不是一个好的选择。就解决我的问题而言,最好是找到一种方法来创建多个div/字段,其中包含正在上传的文件的文件名,然后在该div集合中应用拖放/排序功能。通过这种方式,用户可以轻松地对文件进行优先级排序,并且在保存表单时,在将文件数据保存到数据库中之前,应考虑包含优先级的数组/字段。
感谢响应者的快速响应。

pprl5pva

pprl5pva4#

很高兴你找到了解决问题的方法。在此基础上,我有另一个问题。我希望用户能够选择多个文件,多次。但是每次用户选择新文件时,旧文件都会丢失。
我还建立了一个多文件上传,展示优先级(序列)和文件预览(我的工作与图像)。由于“input.files”是只读属性,因此不能将新文件分配给任何输入。
一个对我有效的变通方法是
1.为我的输入字段使用一个标签,并隐藏输入。
1.在用户选择文件之后,克隆该输入并删除原始输入的ID(以便标签不再引用它)。并将新输入添加到表单。
这样,输入的“名称”保持不变,并且在提交表单时保持不变。所有的文件都发送出去了。
这是HTML示例:

<label for="add-item-image-input" class="button">Upload Image +</label>
<input hidden multiple autocomplete="off" type="file" accept="image/jpeg, image/png" name="images" data-preview-table="add-item-image-preview-table" id="add-item-image-input" onchange="previewMyImages(this)" />

这是一个JavaScript代码片段:

let previewTable = document.getElementById(inputElement.getAttribute("data-preview-table"));
let inputName = inputElement.getAttribute("name");
let newInput = inputElement.cloneNode();
inputElement.removeAttribute("id");

let form = inputElement.form;
let files = [];
Array.from(form.querySelectorAll(`input[name='${inputName}']`))
    .map((input) => (files = [...files, ...input.files]));
console.log(files);
inputElement.insertAdjacentElement("afterend", newInput);

但是,这种方法会引入多次上传同一文件的风险,但这可以通过使用额外的逻辑来防止。

相关问题