2009-10-08 27 views
6

Estoy descargando un archivo dinámico en mi aplicación, simulando ajax usando iframes. Lo que estoy haciendo es que, cuando se realice la solicitud de descarga, crearé un iframe invisible dinámico y estableceré el src de mi iframe como URL de descarga. Puedo descargar el archivo con éxito, pero el requisito es mostrar una descarga. indicador una vez que se inicia la descarga y debe finalizar tan pronto como aparezca el cuadro de diálogo de descarga. Proporcioné la devolución de llamada después de la creación del iframe para mostrar el indicador de descarga, que está funcionando correctamente, y proporcioné otro método para 'cargar' el iframe, esperando se invocará cuando aparezca el diálogo de descarga. Pero desafortunadamente, eso no funciona, y debido a eso, incluso después de que se complete la descarga, mi indicador de progreso todavía está allí. No puedo eliminar eso. Luego me di cuenta de que, dado que el tipo de contenido de la respuesta no es html, será atendido por un proceso separado, que conduce al diálogo de descarga y debido a eso mi método de carga nunca se llama. Por favor, hágame saber una solución para esto.Descarga de archivo Ajax Problema

Respuesta

1

usted debe comenzar un temporizador en el cliente cuando la solicitud de descarga se hace que comprueba el estado del iframe en un intervalo especificado:

if ((iframe.document && iframe.document.readyState == 'complete') 
    || iframe.contentDocument) 
{ 
    stopTimer(); 
    closePopupDialog(); 
} 
+0

Above one está muy cerca de la solución, pero en mi caso, readyState nunca llegó a ser "completo" incluso después de la descarga, permaneció en estado "interactivo". ¿Alguna idea de cuál podría ser el problema? – Bibin

+0

acaba de llegar a saber que, la disposición del contenido juega un papel en eso. Consulte ** [this] (http://www.atalasoft.com/cs/blogs/jake/archive/2009/06/18/events-to-expect-when-dynamically-loading-iframes-in-javascript. aspx) ** – Bibin

+0

Este método * desafortunadamente * no funciona debido al comportamiento inconstante de readyState en todos los navegadores. Por ejemplo, Chrome nunca cambia. –

0

Puede utilizar un administrador de descarga flash - google revelará una gran cantidad de ellos.

Su otra opción es utilizar AJAX real. Simplemente haga una solicitud al URI de descarga, y cuando obtenga su respuesta, use el responseBody en lugar del atributo responseText del objeto XMLHTTPRequest.

Usted necesitará una manera de escribir que para el disco duro, lo que se puede hacer en IE con restricciones de seguridad laxas y la ActiveXObject "Scripting.FileSystemObject" Usted puede ser capaz de utilizar el enfoque de URI de datos: http://en.wikipedia.org/wiki/Data_URI_scheme con una base 64 codificación, pero no estoy seguro si eso funcionará.

De lo contrario, vuelve al flash para escribir en el disco los datos que descargó a través de ajax.

Si conoce el tamaño de la descarga dinámica y el tiempo exacto no es necesario en la especificación, entonces podría hacer una verificación de velocidad de Internet antes de la descarga, agregar un poco de tiempo de búfer al tiempo calculado que tardará en descargarse archivo, y solo muestra el cuadro de diálogo para ese período de tiempo determinado. Muy hacker, pero de nuevo este esquema parece un poco de marketing, requiere-que-a-ser-para-que-se-ser

15

Creé el jQuery File Download plugin (Demo) que también soluciona el problema y proporciona algunas otras características agradables. Básicamente, te ofrece una experiencia "completa de Ajax" para las descargas de archivos (incluso con devoluciones de llamadas) que normalmente no es posible para la descarga de archivos.Funciona bastante similar a algunas otras respuestas con un iframe, pero tiene algunas características interesantes que he encontrado muy útil:

  • usuario nunca sale de la misma página que inician una descarga de archivos a partir de si es correcta o hay un error
  • funciones successCallback y failCallback permiten que usted sea explícito acerca de lo que el comportamiento de la interfaz de usuario está en cualquiera de estas situaciones
  • en conjunción con jQuery UI un desarrollador puede mostrar fácilmente un modal que indica al usuario que se está produciendo una descarga de archivos, disolver el modal después de que comience la descarga o incluso informar al usuario de manera amistosa que ha ocurrido un error. Consulte el Demo para ver un ejemplo de esto.

Aquí hay una demo de caso de uso simple que utiliza el complemento source con promesas. El demo page incluye muchos otros ejemplos de 'mejor UX' también.

$.fileDownload('some/file.pdf') 
    .done(function() { alert('File download a success!'); }) 
    .fail(function() { alert('File download failed!'); }); 
Cuestiones relacionadas