2010-02-27 24 views
6

¿Hay alguna manera de poner en cola cargas de archivos sin recurrir a Flash o Silverlight, solo con formularios hábilmente utilizados y JavaScript? Tenga en cuenta que la carga se debe ejecutar de forma asincrónica.Carga de archivos HTTP asíncronos en cola

Al "cargar en cola" las cargas me refiero a que si el usuario intenta cargar varios archivos, no se deben transferir simultáneamente, sino de a uno por vez, en una sola conexión HTTP.

+0

¿Tiene que haber una conexión HTTP? –

+0

Sí. Ese es el punto de mi pregunta. – dpq

+0

Pregunta: si envía un formulario con varios archivos, ¿se envían todos al mismo tiempo o 1 después de otro? –

Respuesta

2

No creo que sea posible hacerlo en una sola conexión HTTP, debido a limitaciones de la especificación. Sin embargo, puede obtener casi el mismo comportamiento colocando los campos <input> en formularios separados (ya sea con HTML o JavaScript) y enviándolos en orden.

Coloque sus objetivos en un y use el evento iframe.onload para activar el siguiente formulario en la lista.

Notas adicionales:

  • Ver this para iframes de referencia de orientación. Tenga en cuenta que esta característica no está soportada en HTML/XHTML Strict.
  • El atributo form.target debe ser igual al atributo iframe.name. iframe.id no funcionará; Causa una ventana emergente en IE6 y FF3.5.
  • Un ejemplo de funcionamiento de la carga 'todo a la vez' mediante la orientación está disponible en here. Limpié un poco este ejemplo y lo usé. Funciona en IE6 así como en cualquier navegador de primera clase.
+0

Avísame si te funciona. Pensé en probar algo así, pero no tuve tiempo. – Kivin

1

Una opción que he visto antes, aunque no tengo un enlace o un ejemplo, es usar un iframe. Básicamente, los archivos se envían a iframe y JavaScript watches para ver cuándo ese iframe se recarga y luego envía el siguiente. No es bonito y creo que lo intenté, pero no pude hacerlo funcionar en todos los navegadores (que necesitaba en ese momento, incluido IE6).

+0

Bien, gracias. Trataré de implementarlo. ¿Recuerdas con qué navegadores tuviste problemas? – dpq

+0

Creo que el más difícil fue IE6, junto con los otros IEs, pero creo que 7 y 8 estaban bien. Ha pasado un tiempo y eliminé todo el código de prueba, ya que estaba de acuerdo con el uso de Flash, ya que ya se usaba en otras partes del sitio. –

2

Lo tengo de buena fe que Uploadify es muy bueno. Además, admite colas de forma nativa. Un ejemplo simple, que asume que ya ha creado un elemento de "archivo" de formulario con un id de "foo" y un elemento para usar como cola con un id de "cola". Vea el docs para más información.

$("foo").uploadify({ 
    'uploader' : 'uploadify.swf', 
    'script' : 'uploadify.php', 
    'cancelImg' : 'cancel.png', 
    'auto'  : true, 
    'folder' : '/uploads', 
    'queue'  : "queue" 
}); 
+0

Uploadify requiere Flash, mientras estoy buscando una solución que no lo haga. – dpq

+0

Oh, cierto. Lo siento, me olvidé por completo de ese requisito. Por curiosidad, ¿por qué quieres evitar el flash? Uploadify no requiere ninguna interacción con el flash, lo envuelve por usted. – Benson

+0

Debido a las características específicas de la aplicación web en cuestión, uno de sus puntos de venta es que no requiere complementos para hacer ningún trabajo real en absoluto. Como cargar archivos es una tarea bastante importante, preferiría evitar depender de Flash. – dpq

0

En términos mirarlo, lo que hay que hacer:

  • Una función para añadir dinámicamente formas (a html) con el tipo de entrada como archivo. Un formulario tendrá solo un campo de entrada de archivo. Estos formularios serán nuestra cola de carga de archivos.
  • Una función de envío que enviará estos formularios uno tras otro de forma asincrónica.

Esa es la lógica simple que puedo pensar por el momento [tengo que codificar cuando llegue a casa].

0

Hay una sencilla manera eficiente de la carga de archivos asyncronysly con xmlhttprequest: consulte https://developer.mozilla.org/en/using_xmlhttprequest en la sección "En Firefox 3.5 y posterior". Con esto puedes subir archivos asíncronicamente obteniendo también el porcentaje de progreso de carga. Con Firefox 3.6 y versiones posteriores, también puedes subir varios archivos de forma sincronizada. Estoy haciendo una función js para hacer de una manera más simple, cuando termine lo publicaré.

0

En el pasado reciente, escribí un complemento jQuery que le permitía hacer algo como esto. No puedo publicar el código, pero puedo describir cómo funcionó. Si no tiene sentido, házmelo saber, como ha pasado un tiempo.

Había un conjunto de elementos de formulario de carga. Cuando se seleccionaba un archivo, se publicaba en un iFrame oculto, y los contenidos (a través de base64) se copiaban en un campo de formulario oculto. Luego, cuando se envía el formulario final, los contenidos de los campos de formulario ocultos se utilizan para obtener la información del archivo.

Erick

Cuestiones relacionadas