Foros del Web » Programando para Internet » Javascript »

Borrar un registro de un array de input file multiple

Estas en el tema de Borrar un registro de un array de input file multiple en el foro de Javascript en Foros del Web. Estoy realizando un formulario donde se pueden subir múltiples ficheros. Con algún que otro problemilla... pero funciona. Ahora quiero poder decidir borrar algún fichero de ...
  #1 (permalink)  
Antiguo 08/01/2013, 12:40
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Pregunta Borrar un registro de un array de input file multiple

Estoy realizando un formulario donde se pueden subir múltiples ficheros. Con algún que otro problemilla... pero funciona.

Ahora quiero poder decidir borrar algún fichero de los que he seleccionado pero que finalmente no quiero subir. Resulta que por mucho que lo borre del DOM no se borra del array del input file. (anda que yo también)

Buscando un poco me entero de que dicho array es de solo lectura... pero yo normalmente si que lo hago en otros muchos gestores de contenidos...

Así pues... ¿Cual es la forma entonces de actualizar dicho array si quiero borrar un fichero de los cuatro que previamente iba a subir?
__________________
- Y lo que todavía me queda por aprender...
  #2 (permalink)  
Antiguo 08/01/2013, 18:08
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Borrar un registro de un array de input file multiple

Já, ese problema lo tuve yo cuando hice el uploader de javascript puro.
Por cada input file que creo dinámicamente, también creaba un array asociado a él con los índices de los elementos eliminados (futuros, si los hubiera).

Cuando finalmente le daba al botón de subir los ficheros, lo que hacía era recorrer cada input file, y dentro de cada input file recorrería su lista de "files". Si el índice de dicho file no está en la lista de eliminados para ese input file, entonces creaba un objeto ajax (xmlhttprquest) y enviaba el fichero al servidor (una petición ajax por cada fichero). Dicha petición dispara ciertos eventos que sirven para controlar el procentaje del fichero subido y la velocidad de subida.

Pero si tú no tienes pensado hacerlo con AJAX, lo único que se me ocurre (es posible que haya otra forma mejor) es que metas un input hidden en el formulario que se enviará y escribas en él (cada vez que el usuario diga que quiera borrar un fichero) cierta información que te sirva para que luego en el servidor, no almacenar los ficheros eliminados.
Como habrás adivinado, desgraciadamente todos los ficheros se enviarám, pero al menos en el server no guardarás los que no debas guardar.
  #3 (permalink)  
Antiguo 08/01/2013, 20:16
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Borrar un registro de un array de input file multiple

No lo probé a full subiendo los archivos, pero debería funcionar

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es-ar">
  3. <meta charset="utf-8" />
  4. <title>Html5</title>
  5.  
  6. <style type="text/css">
  7. /*<![CDATA[*/
  8.  
  9. span{
  10. cursor: pointer;
  11. }
  12.  
  13. /*]]>*/
  14. <script type="text/javascript">
  15. //<![CDATA[
  16. /* script */
  17. function cantidad(){
  18. var x=document.getElementsByName("archivos[]");
  19. alert(x.length);
  20. return false;
  21. }
  22. function borrar(elid){
  23. document.getElementById(elid).setAttribute('name',null);
  24. document.getElementById(elid).disabled = true;
  25. }
  26. function activar(elid){
  27. document.getElementById(elid).setAttribute('name','archivos[]');
  28. document.getElementById(elid).disabled = false;
  29. }
  30.  
  31. //]]>
  32. </head>
  33.  
  34. <form action="subir.php" method="post" enctype="multipart/form-data" onsubmit="return cantidad();">
  35. <p>Archivo uno<br />
  36. <input name="archivos[]" type="file" id="uno"/> <span onclick="borrar('uno')">borrar</span> | <span onclick="activar('uno')">habilitar</span>
  37. </p>
  38. <p>Archivo dos<br />
  39. <input name="archivos[]" type="file" id="dos" /> <span onclick="borrar('dos')">borrar</span> | <span onclick="activar('dos')">habilitar</span>
  40. </p>
  41. <p>Archivo tres<br />
  42. <input name="archivos[]" type="file" id="tres" /> <span onclick="borrar('tres')">borrar</span> | <span onclick="activar('tres')">habilitar</span>
  43. </p>
  44. <p>
  45. <input type="submit" name="Submit" value="Subir" />
  46. </p>
  47. </form>
  48. </body>
  49. </html>

Y hacerle algunas mejoras con el borrar / habilitar. Si te fijás al hacer el submit el número de elementos del array se modifica. Es cuestión de probar

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #4 (permalink)  
Antiguo 09/01/2013, 03:53
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Borrar un registro de un array de input file multiple

Ese no funciona bien porque no se borran archivos individuales, que es lo lógico, si no todos los archivos elegidos por un input file.
  #5 (permalink)  
Antiguo 09/01/2013, 14:16
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Borrar un registro de un array de input file multiple

Lo probé en local y si funcionó

html

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es-ar">
  3. <meta charset="utf-8" />
  4. <title>Html5</title>
  5.  
  6. <style type="text/css">
  7. /*<![CDATA[*/
  8.  
  9. span{
  10. cursor: pointer;
  11. }
  12.  
  13. /*]]>*/
  14. <script type="text/javascript">
  15. //<![CDATA[
  16. /* script */
  17. function cantidad(){
  18. var x=document.getElementsByName("archivos[]");
  19. alert(x.length);
  20. return false;
  21. }
  22. function borrar(elid){
  23. document.getElementById(elid).setAttribute('name',null);
  24. document.getElementById(elid).disabled = true;
  25. }
  26. function activar(elid){
  27. document.getElementById(elid).setAttribute('name','archivos[]');
  28. document.getElementById(elid).disabled = false;
  29. }
  30.  
  31. //]]>
  32. </head>
  33.  
  34. <form action="subir_varios.php" method="post" enctype="multipart/form-data">
  35. <p>Archivo uno<br />
  36. <input name="archivos[]" type="file" id="uno"/> <span onclick="borrar('uno')">borrar</span> | <span onclick="activar('uno')">habilitar</span>
  37. </p>
  38. <p>Archivo dos<br />
  39. <input name="archivos[]" type="file" id="dos" /> <span onclick="borrar('dos')">borrar</span> | <span onclick="activar('dos')">habilitar</span>
  40. </p>
  41. <p>Archivo tres<br />
  42. <input name="archivos[]" type="file" id="tres" /> <span onclick="borrar('tres')">borrar</span> | <span onclick="activar('tres')">habilitar</span>
  43. </p>
  44. <p>
  45. <input type="submit" name="procesar_subida" value="Subir" /> <input type="reset" value="restablecer" />
  46. </p>
  47. </form>
  48. </body>
  49. </html>

php

Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es-ar">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>upload multiple php</title>
  6. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  7. <style type="text/css">
  8. /*<![CDATA[*/
  9. body{
  10. font-size: 11pt;
  11. font-family: verdana, sans-serif;
  12. color: #252525;
  13. }
  14. /*]]>*/
  15. </style>
  16. </head>
  17. <body>
  18. <?php
  19. if (isset($_POST['procesar_subida'])) {
  20.     $campos_file = 0;
  21.     $archivos_enviados = 0;
  22.     $archivos_movidos = 0;
  23.     $archivos_subidos = array();
  24.     $directorio_destino = dirname(__file__) . '/subidos/'; //directorio de destino (0777)
  25.     for($i = 0; $i < count($_FILES['archivos']['name']); $i++) {
  26.         $campos_file++;      
  27.         if ($_FILES['archivos']['name'][$i] != '') {
  28.             $archivos_enviados++;
  29.             $archivos_subidos[] = $_FILES['archivos']['name'][$i];
  30.             if (move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $directorio_destino . $_FILES['archivos']['name'][$i])) {
  31.                 $archivos_movidos++;
  32.             }
  33.         }
  34.     }
  35.    
  36.     echo "\n<div>\n<p><b>Estadísticas:</b></p>\n";
  37.     echo "Número de campos file es $campos_file.<br/>\n";
  38.     echo "Número de archivos enviados por post es $archivos_enviados.<br/>\n";
  39.     echo "Número de archivos movidos correctamente $archivos_movidos.<br/>\n";
  40.     echo "Los nombres de archivo subidos son <br/>\n<b>" . implode('<br />', $archivos_subidos) . "</b>\n</div>\n";
  41. }
  42. ?>
  43. <p><a href="<?php echo $_SERVER['HTTP_REFERER']; ?>">Enviar otros</a></p>
  44. </body>
  45. </html>
El php es muy básico y no limita por extension, mimeType ó tamaño


No funcionaría si usamos el tributo multiple (@navegante no hace ninguna referencia al mismo) en nuestro input file, pero si, si lo hacemos a partir de varios campos file.

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #6 (permalink)  
Antiguo 09/01/2013, 16:47
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Borrar un registro de un array de input file multiple

Cuando leí lo de subida múltiple da archivos asumí que también quería poder seleccionar múltiples ficheros, porque en el casi de que el cliente quiera subir muchos archivos de una misma carpeta, elegirlos uno a uno es molesto; y como hizo referencia al array de files del objeto input, que efectívamente es de sólo lectura, pensé que tuvo el mismo problema que yo.
  #7 (permalink)  
Antiguo 12/01/2013, 07:40
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Respuesta: Borrar un registro de un array de input file multiple

Cita:
Iniciado por marlanga Ver Mensaje
Cuando leí lo de subida múltiple da archivos asumí que también quería poder seleccionar múltiples ficheros, porque en el casi de que el cliente quiera subir muchos archivos de una misma carpeta, elegirlos uno a uno es molesto; y como hizo referencia al array de files del objeto input, que efectívamente es de sólo lectura, pensé que tuvo el mismo problema que yo.
Hola a todos, perdón por mi ausencia. Estuve con otra parte del código y ahora vuelvo a esta...

Pues efectivamente uso un input file multiple, por lo que por lo leido el ejemplo de @emprear no va a funcionar.

@emprear, mil perdones por hacerte perder el tiempo, fue culpa mia el no especificar un poco mejor las cosas.

La respuesta de @marlanga me la miraré con más detalle, aunque ya pone que los ficheros realmente se suben al servidor... bueno no se si ese sistema lo usan otros o no y como lo hacen disimuladamente no me entero, pero no me gustaría que se subieran archivos al servidor de más cuando no van a mantenerse.

He mirado algunas opciones completas como jQuery File Upload .
Son impresionantes y cumplen de sobras con lo que necesito, pero me resultan demasiado engorrosas para implementarlas. En realidad no necesito tanto.

Sin ir más lejos esta opción (jquery file upload) me da la posibilidad de subir cada fichero de forma independiente. Yo no quiero eso, pero no he sido capaz de descubrir la forma de quitar esos botones sin que todo se desmonte. Intenté tambien añadir en cada archivo un campo input text y un textarea, pero lo mismo no hubo manera... demasiado complejo (al menos para mi).

Por eso quiero mirar de hacerlo yo mismo, adaptar un poco las cosas, pero veo que esto es más problemático de lo que pensaba... (no todo en esta vida tiene que ser fácil jeje)

Seguro que seguiré pidiendo socorro por aquí
__________________
- Y lo que todavía me queda por aprender...

Etiquetas: file, formulario, funcion, input, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:57.