现在我们可以把文件拖放到一个特殊的容器中,然后用XHR 2上传。一次很多。实时进度条等。非常酷的东西。例子。

但有时候我们并不想要那么酷。我想要的是拖放文件—许多一次—到一个标准的HTML文件输入:<input type=file multiple>。

这可能吗?是否有一些方法来“填充”文件输入与正确的文件名(?)从文件掉落?(出于文件系统安全原因,不能使用完整的文件路径。)

为什么?因为我想提交一份正常的表格。适用于所有浏览器和所有设备。拖放只是为了增强和简化用户体验的渐进式增强。带有标准文件输入(+多个属性)的标准表单将出现在那里。我想增加HTML5的增强功能。

编辑 我知道在某些浏览器中,有时(几乎总是)可以将文件放入文件输入本身。我知道Chrome通常会这样做,但有时它会失败,然后在当前页面加载文件(如果你正在填写表单,这是一个大失败)。我想愚弄&防浏览器。


当前回答

这是对William Entriken给出的例子的改进、修正和修改。有一些问题。例如,<input type="file" />的正常按钮没有做任何事情(以防用户想要以这种方式上传文件)。

注意:我正在制作一个只有我自己使用的web应用程序,所以这只针对Firefox进行了测试(和改进)。我确信,即使您开发跨浏览器的情况下,这些代码也是有价值的。

function readFile(e) { var files; if (e.target.files) { files=e.target.files } else { files=e.dataTransfer.files } if (files.length==0) { alert('What you dropped is not a file.'); return; } var file=files[0]; document.getElementById('fileDragName').value = file.name document.getElementById('fileDragSize').value = file.size document.getElementById('fileDragType').value = file.type reader = new FileReader(); reader.onload = function(e) { document.getElementById('fileDragData').value = e.target.result; } reader.readAsDataURL(file); } function getTheFile(e) { e.target.style.borderColor='#ccc'; readFile(e); } <input type="file" onchange="readFile(event)"> <input id="fileDragName"> <input id="fileDragSize"> <input id="fileDragType"> <input id="fileDragData"> <div style="width:200px; height:200px; border: 10px dashed #ccc" ondragover="this.style.borderColor='#0c0';return false;" ondragleave="this.style.borderColor='#ccc'" ondrop="getTheFile(event); return false;" ></div>

其他回答

这是对William Entriken给出的例子的改进、修正和修改。有一些问题。例如,<input type="file" />的正常按钮没有做任何事情(以防用户想要以这种方式上传文件)。

注意:我正在制作一个只有我自己使用的web应用程序,所以这只针对Firefox进行了测试(和改进)。我确信,即使您开发跨浏览器的情况下,这些代码也是有价值的。

function readFile(e) { var files; if (e.target.files) { files=e.target.files } else { files=e.dataTransfer.files } if (files.length==0) { alert('What you dropped is not a file.'); return; } var file=files[0]; document.getElementById('fileDragName').value = file.name document.getElementById('fileDragSize').value = file.size document.getElementById('fileDragType').value = file.type reader = new FileReader(); reader.onload = function(e) { document.getElementById('fileDragData').value = e.target.result; } reader.readAsDataURL(file); } function getTheFile(e) { e.target.style.borderColor='#ccc'; readFile(e); } <input type="file" onchange="readFile(event)"> <input id="fileDragName"> <input id="fileDragSize"> <input id="fileDragType"> <input id="fileDragData"> <div style="width:200px; height:200px; border: 10px dashed #ccc" ondragover="this.style.borderColor='#0c0';return false;" ondragleave="this.style.borderColor='#ccc'" ondrop="getTheFile(event); return false;" ></div>

简单明了。您不需要创建一个新的FormData或执行Ajax来发送图像。您可以在输入字段中放置拖拽文件。

Osx用户:也许在Osx中你需要最大化你的浏览器来拖动文件。为什么?idk。

$dropzone.ondrop = function (e) {
    e.preventDefault();
    input.files = e.dataTransfer.files;
}

var $dropzone = document.querySelector('.dropzone'); var input = document.getElementById('file-upload'); $dropzone.ondragover = function (e) { e.preventDefault(); this.classList.add('dragover'); }; $dropzone.ondragleave = function (e) { e.preventDefault(); this.classList.remove('dragover'); }; $dropzone.ondrop = function (e) { e.preventDefault(); this.classList.remove('dragover'); input.files = e.dataTransfer.files; } .dropzone { padding: 10px; border: 1px dashed black; } .dropzone.dragover { background-color: rgba(0, 0, 0, .3); } <div class="dropzone">Drop here</div> <input type="file" id="file-upload" style="display:none;">

这是我得出的结论。

使用Jquery和Html。这将把它添加到插入文件中。

var dropzone = $('#dropzone') dropzone.on('drag dragstart dragend dragover dragenter dragleave drop', function(e) { e.preventDefault(); e.stopPropagation(); }) dropzone.on('dragover dragenter', function() { $(this).addClass('is-dragover'); }) dropzone.on('dragleave dragend drop', function() { $(this).removeClass('is-dragover'); }) dropzone.on('drop',function(e) { var files = e.originalEvent.dataTransfer.files; // Now select your file upload field // $('input_field_file').prop('files',files) }); input { margin: 15px 10px !important;} .dropzone { padding: 50px; border: 2px dashed #060; } .dropzone.is-dragover { background-color: #e6ecef; } .dragover { bg-color: red; } <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <div class="" draggable='true' style='padding: 20px'> <div id='dropzone' class='dropzone'> Drop Your File Here </div> </div>

对于那些想在2018年这样做的人来说,我有一个比这里发布的所有旧东西更好更简单的解决方案。你可以用普通的HTML, JavaScript和CSS做一个漂亮的拖放框。

(目前只适用于Chrome)

让我们从HTML开始。

<div>
<input type="file" name="file" id="file" class="file">
<span id="value"></span>
</div>

然后我们来做造型。

    .file {
        width: 400px;
        height: 50px;
        background: #171717;
        padding: 4px;
        border: 1px dashed #333;
        position: relative;
        cursor: pointer;
    }

    .file::before {
        content: '';
        position: absolute;
        background: #171717;
        font-size: 20px;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 100%;
        height: 100%;
    }

    .file::after {
        content: 'Drag & Drop';
        position: absolute;
        color: #808080;
        font-size: 20px;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }

在你完成这些之后,它看起来已经很好了。但我想你们想看看上传的是什么文件,因此我们将使用JavaScript。还记得pfp-value跨度吗?这就是我们打印文件名的地方。

let file = document.getElementById('file');
file.addEventListener('change', function() {
    if(file && file.value) {
        let val = file.files[0].name;
        document.getElementById('value').innerHTML = "Selected" + val;
    }
});

就是这样。

您可以做的是显示一个文件输入,并用透明的下拉区域覆盖它,注意使用像文件[1]这样的名称。{确保在FORM标签中有enctype="multipart/ FORM -data"}

然后让下拉区域通过动态地为文件2创建更多的文件输入来处理额外的文件。Number_of_files,请确保使用相同的基名,适当地填充value-属性。

最后(前端)提交表单。


处理这个方法所需要做的就是修改过程来处理一个文件数组。