2010-12-04 81 views
7

Estoy enviando datos JSON a un servidor. El servidor genera un archivo PDF y responde con la URL a ese archivo PDF. Luego hago otra solicitud al servidor para descargar el archivo PDF. Para realizar la descarga, creo un iframe oculto y establezco el origen en la URL del PDF. Tenga en cuenta que quiero que el navegador del usuario permanezca en la misma página y se descargue en segundo plano. Se pueden encontrar más detalles sobre lo que estoy haciendo y la solución que encontré en this SO question.Error de Chrome al descargar el archivo a través del iframe

Cada vez que uso esta técnica en Chrome, todo funciona bien. Pero al mirar la consola del desarrollador de Chrome, veo el mensaje de error Failed to load resource. ¿Hay alguna manera de hacer esto de manera diferente para que no obtenga estos errores?

Puede verse un muy simple y funcional example of the problem in action en jsfiddle. Simplemente haga clic en el botón Descargar PDF y mire su consola de Chrome.

El código de esa página es el siguiente:

$(document).ready(function() { 
    var downloadFile = function(url){ 
     var iframe = $("iframe#download"); 
     if (!iframe.length) { 
      iframe = $("<iframe id='download' style='display:none;'/>"); 
      $("body").append(iframe); 
     } 
     iframe.attr("src", url); 
    }; 

    $("button").click(function() {  
     downloadFile("http://www.education.gov.yk.ca/pdf/pdf-test.pdf"); 
    }); 
}); 
+2

Si saca la "pantalla: ninguna"; funciona para mí en Chrome Stable para Mac. Creo que tiene algo que ver con el hecho de que Chrome está intentando abrir el PDF usando un visor de PDF incorporado. Tal vez intente cambiar el tipo de contenido de la respuesta de application/pdf a application/octet-stream para que simplemente lo trate como un archivo normal y lo descargue. –

Respuesta

4

Otros encuestados han sugerido cambiar el encabezado de tipo de contenido, que debería funcionar igual de bien, pero hay un encabezado de respuesta específica para instruir al navegador cómo tratar un archivo.

Lo que sigue debe obligar al pdf para ser descargado en lugar de que se muestra en el navegador:

"Content-Disposition: attachment; filename = [nombre de su archivo]"

+0

Gracias. Tendré que volver y comprobar, pero creo que ya estoy haciendo esto. – Tauren

+0

Por algún motivo, la técnica que estaba utilizando dejó de funcionar para algunas de mis descargas en Chrome, aunque las descargas siguieron funcionando correctamente en Safari. Este cambio ocurrió en algún momento de la última semana más o menos. Tal vez algo cambió en la última versión de Chrome? De todos modos, descubrí que no estaba configurando 'Content-disposition' para todo, y una vez que lo agregué, las descargas comenzaron a funcionar nuevamente en Chrome. Estaba configurando el tipo de contenido antes, pero agregar la disposición hizo la diferencia. Así que estoy marcando esta solución como la respuesta. – Tauren

+1

Solo pensé en mencionar un gotcha que me atrapó. Asegúrese de que la parte 'adjunta' del encabezado viene antes de la parte 'nombre de archivo', es decir, debe leer 'archivo adjunto'; filename = wibble.txt 'en vez de' filename = wibble.txt; adjunto archivo' –

-2

mover su función fuera de document.ready ...

funciones generales deben estar siempre fuera ... y debe decirse que dondequiera se necesita

$(document).ready(function() {  

    $("button").click(function() {  
     downloadFile("http://www.education.gov.yk.ca/pdf/pdf-test.pdf"); 
    }); 
}); 

    var downloadFile = function(url){ 
      var iframe = $("iframe#download"); 
      if (!iframe.length) { 
       iframe = $("<iframe id='download' style='display:none;'/>"); 
       $("body").append(iframe); 
      } 
      iframe.attr("src", url); 
     }; 
+0

Gracias, y en mi aplicación ya lo hago. Mi ejemplo fue rápido y sucio para ilustrar el problema. Pero tu respuesta no aborda mi pregunta para nada. ¿Alguna idea de por qué recibo el mensaje de error 'Fallé al cargar el recurso' en Chrome? – Tauren

+0

Así que cuando hago clic en el botón en JSFiddler parece que todos los elementos de la página se vuelven más pequeños (estoy en Chrome 8.0.552.215). Aparte de eso, ¿podría explicar por qué eliminar la función de document.ready hace que esto funcione? Editar: la contracción de la página se debe a que el zoom de Chrome se configuró entre 100% y 34% después de hacer clic en el botón, raro. – Steven

+0

Tienes razón, @shambleh. Eso es muy extraño Me pregunto qué está causando ese cambio de zoom. A pesar de todo, sigo viendo el error 'Fallo al cargar el recurso' después de sacar la función de' ready() '. Aquí hay una versión actualizada en jsfiddle: http://jsfiddle.net/94WvR/3/ No veo cómo podría importar la ubicación de la función. – Tauren

0

he cambiado el src de la imagen a uno en mi propio servidor web y establecer el "tipo de contenido" de la cabecera de la respuesta a "application/octet-stream" en lugar de "aplic ation/pdf ", y se descargó correctamente en Chrome. Debo señalar que el error todavía apareció en la consola ("Error al cargar el recurso"), pero me incitó a descargar el archivo de todos modos.

2

Esto está fuera de mi cabeza, creo que me he encontrado con el mismo problema anteriormente. Cuando el iframe se agrega por primera vez al dom, no tiene src, lo que hace que Chrome "NO CARGUE EL RECURSO".

Trate de añadir un src inicial para el iframe -

iframe = $("<iframe id='download' src='about:blank' style='display:none;'/>"); 

Eso debería hacerlo yo creo. (Puede rechazarme un billón de veces si está mal :))

+0

Por cierto, traté de buscar en su enlace jsfiddle, y no recibí ningún error en la consola, ¿está usando 10.0.648.204? – ansiart

+0

Gracias por la sugerencia de incluir un 'src'. Actualmente estoy usando 10.0.648.204 en OSX, pero cuando publiqué esta pregunta seguramente estaba usando algo antes. Parece que el archivo PDF de prueba que señalé anteriormente ahora da como resultado 200 OK, pero el contenido está vacío. Probablemente debería cambiar el jsfiddle para apuntar a un archivo PDF real para descargar y ver cómo funciona. – Tauren

+0

¿sigues recibiendo el error? Creo que las versiones más nuevas de Chrome no muestran un error en los iframes vacíos – ansiart

2

Chrome tiene un built-in PDF espectador. Cuando configuras el src del iframe, Chrome simplemente intenta mostrar el archivo PDF. Como está configurado en display:none, la descarga se cancela y usted recibe ese mensaje.

Pruebe la configuración display a algo que no sea none y coloque el iframe fuera de la pantalla con position:absolute.

0
var downloadFile = function(url){ 
    var iframe = $("iframe#download"); 
    if (!iframe.length) { 
     iframe = $("<iframe id='download' style='display:none;'/>"); 
     $("body").append(iframe); 
    } 
    iframe.attr("src", url); 
    iframe.on('load',function(){ 
      console.log("error") 
    }); 
}; 

U simplemente prueba esto, funciona, pero esta no es una forma correcta de resolver este problema ...

Cuestiones relacionadas