2012-05-02 35 views
8

Estoy intentando implementar la carga de múltiples archivos HTML5 nativos mediante el método de arrastrar y soltar. He estado siguiendo tutoriales como http://onehub.com/blog/posts/designing-an-html5-drag-drop-file-uploader-using-sinatra-and-jquery-part-1/ y http://www.html5rocks.com/en/tutorials/file/dndfiles/ pero todavía no he encontrado la solución que necesito.Crear archivo arrastrar y soltar subir div, para que funcione como un tipo de entrada = "archivo"

Básicamente quiero simular la funcionalidad de un elemento de entrada de carga de múltiples archivos HTML5, pero con un div en la bruja escucho los eventos de caída.

En otras palabras, quiero hacer una forma como ésta:

<form method="post" action="somesscript.php" enctype="multipart/form-data"> 
    <input type="text" /> 
    <div class="drop"> 
     <p>Drop files here</p> 
    </div> 
    <input type="submit" /> 
</form> 

trabajo como si estuviera hecha de esta manera:

<form method="post" action="somesscript.php" enctype="multipart/form-data"> 
    <input type="text" /> 
    <input name="filesToUpload[]" type="file" multiple /> 
    <input type="submit" /> 
</form> 

El arrastrar y soltar campo debe ser entendido como parte del formulario, y cuando se envíe el formulario, solo deseo que todos los datos de las entradas y el conjunto de archivos del campo de arrastrar y soltar se envíen a través de AJAX al servidor.

Hasta ahora solo he implementado la lectura de los nombres de los archivos en un evento drop. Quiero que todos los archivos abandonados se agreguen a una matriz, pero no sé cómo acceder a los archivos en sí, no a sus atributos, para que este último pueda enviar esta matriz de archivos en el formulario enviado a través de AJAX junto con el resto del datos de formulario.

Quiero algo como:

var data = e.originalEvent.dataTransfer, 
       files = data.files, 
       filesArray = [], 
       filesLength = files.length, 
       i; 


     for (i = 0; i < filesLength; i++) { 
      var file = files[i]; 
      filesArray.push(file); 
     } 

return filesArray; 

Además, soy consciente de que hay plugins para esto, pero quiero hacerlo nativa.

+0

¿Alguna vez encontrar una solución, @Husar? – Barney

+1

Sí, guardo los archivos en una matriz. El único problema fue enviar con AJAX junto con el resto de los campos del formulario. Me las arreglé para hacer esto usando la funcionalidad FormData (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData). – Maverick

Respuesta

-2
<input name="filesInput" type="file" multiple onchange="fileUpload()"/> 
<div class="drop" ondrop="fileUpload()" > 
     <p>Drop files here</p> 
</div> 

function(e){ 
    var files=e.target.file||e.dataTransfer.files; 
    for(var i=0;i<file.length;i++) 
    { 
    //upload files 
    } 
} 

Esto funcionará.

2

Aquí hay una implementación sencilla de un archivo de arrastre & bien usando vanile jQuery y un [input type = "file"]. Acepta un solo archivo.

http://jsfiddle.net/davidfstr/y2y50222/3/

Ignore this code section. Apparently SO requires it for posts that link to jsfiddle. 
+0

por lo que puedo ver este JSfiddle falla para IE 11. No inserta el archivo en el tipo de entrada = archivo elemento, sino que crea una página completamente nueva que muestra el contenido del archivo eliminado. – Pancho

0

sé que ya tiene hace años las respuestas :) pero aquí es una solución de 2017, principalmente para gente como yo que buscan una solución de aspecto agradable: Puede hacerlo con el archivo de entrada, funcionará en navegadores modernos, para IE tendrá que usar un respaldo.

Si desea también los nombres de los archivos, y un poco de interfaz de usuario más elegante usando solo usted puede usar mi ejemplo;

Este código se puede aplicar en cualquier forma y hacer exactamente eso.

https://jsfiddle.net/artipixel/zkrfcbLd/

var globalFunctions = {}; 
 

 
globalFunctions.ddInput = function(elem) { 
 
    if ($(elem).length == 0 || typeof FileReader === "undefined") return; 
 
    var $fileupload = $('input[type="file"]'); 
 
    var noitems = '<li class="no-items"><span class="blue-text underline">Browse</span> or drop here</li>'; 
 
    var hasitems = '<div class="browse hasitems">Other files to upload? <span class="blue-text underline">Browse</span> or drop here</div>'; 
 
    var file_list = '<ul class="file-list"></ul>'; 
 
    var rmv = '<div class="remove"><i class="icon-close icons">x</i></div>' 
 

 
    $fileupload.each(function() { 
 
    var self = this; 
 
    var $dropfield = $('<div class="drop-field"><div class="drop-area"></div></div>'); 
 
    $(self).after($dropfield).appendTo($dropfield.find('.drop-area')); 
 
    var $file_list = $(file_list).appendTo($dropfield); 
 
    $dropfield.append(hasitems); 
 
    $dropfield.append(rmv); 
 
    $(noitems).appendTo($file_list); 
 
    var isDropped = false; 
 
    $(self).on("change", function(evt) { 
 
     if ($(self).val() == "") { 
 
     $file_list.find('li').remove(); 
 
     $file_list.append(noitems); 
 
     } else { 
 
     if (!isDropped) { 
 
      $dropfield.removeClass('hover'); 
 
      $dropfield.addClass('loaded'); 
 
      var files = $(self).prop("files"); 
 
      traverseFiles(files); 
 
     } 
 
     } 
 
    }); 
 

 
    $dropfield.on("dragleave", function(evt) { 
 
     $dropfield.removeClass('hover'); 
 
     evt.stopPropagation(); 
 
    }); 
 

 
    $dropfield.on('click', function(evt) { 
 
     $(self).val(''); 
 
     $file_list.find('li').remove(); 
 
     $file_list.append(noitems); 
 
     $dropfield.removeClass('hover').removeClass('loaded'); 
 
    }); 
 

 
    $dropfield.on("dragenter", function(evt) { 
 
     $dropfield.addClass('hover'); 
 
     evt.stopPropagation(); 
 
    }); 
 

 
    $dropfield.on("drop", function(evt) { 
 
     isDropped = true; 
 
     $dropfield.removeClass('hover'); 
 
     $dropfield.addClass('loaded'); 
 
     var files = evt.originalEvent.dataTransfer.files; 
 
     traverseFiles(files); 
 
     isDropped = false; 
 
    }); 
 

 

 
    function appendFile(file) { 
 
     console.log(file); 
 
     $file_list.append('<li>' + file.name + '</li>'); 
 
    } 
 

 
    function traverseFiles(files) { 
 
     if ($dropfield.hasClass('loaded')) { 
 
     $file_list.find('li').remove(); 
 
     } 
 
     if (typeof files !== "undefined") { 
 
     for (var i = 0, l = files.length; i < l; i++) { 
 
      appendFile(files[i]); 
 
     } 
 
     } else { 
 
     alert("No support for the File API in this web browser"); 
 
     } 
 
    } 
 

 
    }); 
 
}; 
 

 
$(document).ready(function() { 
 
    globalFunctions.ddInput('input[type="file"]'); 
 
});
.blue-text { 
 
    color: blue; 
 
} 
 

 
.underline { 
 
    text-decoration: underline; 
 
} 
 

 
.drop-field { 
 
    position: relative; 
 
    text-align: center; 
 
    vertical-align: middle; 
 
} 
 

 
.drop-field, 
 
.drop-area { 
 
    height: 150px; 
 
    width: 300px; 
 
} 
 

 
.drop-field .browse { 
 
    z-index: 0; 
 
    position: absolute; 
 
    left: 0; 
 
    bottom: 0; 
 
    right: 0; 
 
    margin: 0 auto; 
 
} 
 

 
.drop-field .drop-area { 
 
    display: block; 
 
    border: 1px dashed gray; 
 
    position: relative; 
 
} 
 

 
.drop-field, 
 
.drop-area, 
 
.drop-field .browse { 
 
    transition: all 0.3s; 
 
} 
 

 
.drop-field.loaded .drop-area { 
 
    border: 1px solid blue; 
 
} 
 

 
.drop-field .browse { 
 
    opacity: 0; 
 
    transform: translateY(100%); 
 
} 
 

 
.drop-field.loaded .browse { 
 
    opacity: 1; 
 
    transform: translateY(0); 
 
} 
 

 
.drop-field.hover .drop-area { 
 
    border: 1px solid black; 
 
} 
 

 
.drop-field .drop-area input[type="file"] { 
 
    height: 100%; 
 
    width: 100%; 
 
    position: absolute; 
 
    display: block; 
 
    z-index: 3; 
 
    top: 0; 
 
    left: 0; 
 
    opacity: 0.000001; 
 
} 
 

 
.drop-field .file-list { 
 
    position: absolute; 
 
    z-index: 0; 
 
    top: 0; 
 
    left: 0; 
 
    text-align: center; 
 
} 
 

 
.drop-field .remove { 
 
    position: absolute; 
 
    left: 20px; 
 
    top: 20px; 
 
    z-index: 4; 
 
    transition: all 0.3s; 
 
    opacity: 0; 
 
    transform: translateY(-100%); 
 
    cursor: pointer; 
 
} 
 

 
.drop-field .remove:hover { 
 
    color: blue; 
 
} 
 

 
.drop-field.loaded .remove { 
 
    opacity: 1; 
 
    transform: translateY(0); 
 
} 
 

 
.drop-field ul li { 
 
    padding: 0; 
 
    text-align: center; 
 
    list-style: none; 
 
} 
 

 

 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="file" multiple>

Cuestiones relacionadas