我有一个输入文件元素。
<input type='file' id='tempFileInput' multiple></input>
假设我为上面的文件输入框选择了三个文件('tempFileInput');
OnChange我想将三个文件分成三个新文件输入框,用于每个文件。即
<input type='file' id='inputFile_0'></input>
<input type='file' id='inputFile_1'></input>
<input type='file' id='inputFile_2'></input>
我正在努力实现这一目标。有什么帮助吗?
//我已经编写了一个小的JavaScript代码片段来实现我的目标。
var index = 0;
function multipleInputBoxes(tempFileInput){
var divForm = document.getElementById('divForm');
var numOfFiles = tempFileInput.files.length;
for(var i=0; i<numOfFiles; i++){
var newUploader = document.createElement('input');
newUploader.type='file';
newUploader.id = 'inputFile_' + index;
var file = tempFileInput.files[i];
***newUploader.files[0] = file;***
//above line does not work, as by default due to security reasons input type='file' is read only, and non editable.
divForm.appendChild(newUploader);
index++;
}
}
答案 0 :(得分:1)
在其他文章中找到分散的代码,并组装了一个工作示例,该示例将输入文件“多个”文件分解为单个文件,并允许您删除它们或添加新文件,而不会丢失先前选择的文件:
JS代码
// Requires jQuery
function addFileToNewInput(file, newInput) {
if (!newInput) { return }
var dataTransfer = new DataTransfer()
dataTransfer.items.add(file)
newInput.files = dataTransfer.files
}
function addFileNameToPreview(file, preview) {
if (!preview) { return }
preview.innerText = file.name
}
function breakIntoSeparateFiles(input, targetSelector, templateSelector) {
var $input = $(input)
var templateHtml = $(templateSelector).html()
if (!input.files) { return }
for(var file of input.files) {
var $newFile = $(templateHtml).appendTo(targetSelector)
addFileToNewInput(file, $newFile.find("input")[0])
addFileNameToPreview(file, $newFile.find(".file-name")[0])
}
$input.val([])
}
HTML
<!-- Requires bootstrap css for style -->
<form class="m-5">
<div id="file-list"></div>
<label for="upload_input" class="btn btn-warning">Upload</label>
<input
id="upload_input"
type="file"
name="post[attachments][]"
class="d-none"
multiple="multiple"
onchange="window.breakIntoSeparateFiles(this, '#file-list', '#file-preview')"
/>
<template id="file-preview">
<div class="file-preview mb-2">
<span class="file-name"></span>
<button
class="btn btn-sm btn-danger ml-2"
onclick="$(this).closest('.file-preview').remove()"
>×</button>
<input class="d-none" multiple="multiple" type="file" name="post[attachments][]">
</div>
</template>
</form>
我为此撰写了一篇文章,其中包含更多示例:https://medium.com/@goncalvesjoao/break-input-file-into-individual-files-and-preview-them-29fdbab925b2
答案 1 :(得分:0)
如果您使用的是HTML5,则可以选择包含一个input
标记的多个文件。不需要额外的。
使用下面的HTML5:
<input type='file' id='tempFileInput' multiple='multiple'></input>
<强>更新强>
没有办法做你想做的事。 files
属性仅出于某种原因准备就绪。这是为了防止在没有用户同意的情况下上传文件。如果它不是只读的,那么你可以编写脚本并从用户的计算机上传任何文件,这是一个巨大的安全问题。
答案 2 :(得分:0)
因此,我无法访问文件( s )表单文件输入,并在每种表单中单独保存它们。由于我可以访问每个文件 var file = tempFileInput.files[i]
,我创建了一个循环并将每个文件保存在html'object'标记中,并将文件对象保存在object.value中。例如
var numOfFile = tempFileInput.files.length;
for (var int i=0; i<numOfFile; i++){
//get file object from the filinput element
var file = tempFileInput.files[i];
//create new element
var newObj = document.createElement('object');
newObj.id = 'obj_' + i;
newObj.value = file;
//append object to new form
createNewForm(newObj);
}
function createNewForm(newObj){
...do something here
...
...
newForm.appendChild(newObj);
}