Pregunta

En una web basada en PHP sitio, quiero enviar a los usuarios un paquete de descarga después de haber rellenado un formulario corto.El sitio de iniciada la descarga debe ser similar a sitios como download.com que dicen que "su descarga comenzará en un momento."

Un par de enfoques posibles Yo sé acerca de, y la compatibilidad del navegador (basado en una prueba rápida):

1) Hacer un window.open apunta a que el nuevo archivo.

- FireFox 3 blocks this.  
 - IE6 blocks this.  
 - IE7 blocks this.

2) Crear un iframe que apunta a que el nuevo archivo.

- FireFox 3 seems to think this is OK. (Maybe it's because I already accepted it once?)  
 - IE6 blocks this.  
 - IE7 blocks this.

How can I do this so that at least these three browsers will not object? 

Bono:hay un método que no requiere de navegador-sentencias condicionales?

(Yo creo que download.com emplea ambos métodos de forma condicional, pero yo no puedo ir a trabajar.)

Las respuestas y Aclaraciones:

Q: "Why not point the current window to the file?"  
A: That might work, but in this particular case, I want to show them some other content while their download starts - for example, "would you like to donate to this project?"

ACTUALIZACIÓN:He abandonado este enfoque.Véase mi respuesta a continuación por razones.

¿Fue útil?

Solución

Usted también puede hacer un meta refresh, que la mayoría de los navegadores soportan.Download.com coloca en una etiqueta "noscript".

<meta http-equiv="refresh" content="5;url=/download.php?doc=123.zip"/>

Otros consejos

Actualización:He decidido abandonar este enfoque, y en lugar de sólo presentar al usuario con un enlace al archivo real.Mi razonamiento es el siguiente:

Mi intento inicial de un servidor de iniciada la descarga fueron bloqueados por el navegador.Que me puso a pensar:"el navegador es el adecuado.¿Cómo es sabemos que este es un legítimo de descarga?Es debe bloque de una descarga que no es, obviamente, iniciado por el usuario."

Cualquier método que puedo usar para un servidor de iniciada la descarga podría también ser usada por alguien que quiere enviar malware.Por lo tanto, las descargas, sólo debe ocurrir cuando el usuario solicite específicamente el archivo haciendo clic en un enlace para ello.

Eres libre de estar en desacuerdo, y si usted todavía desea iniciar una descarga, espero que este hilo te ayudará a hacerlo.

Normalmente yo sólo tengo un script PHP que genera el archivo directamente en el navegador con el correspondiente Tipo de Contenido

if(file_exists($filename)) {
    header("Pragma:  public");
    header("Expires:  0");
    header("Cache-Control:  must-revalidate, pre-check=0");
    header("Cache-Control:  private", false);
    header("Content-Type:  " . $content-type);
    header("Content-Disposition:  attachment; filename=\"" . basename($filename) . "\";" );
    header("Content-Transfer-Encoding:  binary");
    header("Content-Length:  " . filesize($filename));

    readfile("$filename");
}else{
    print "ERROR:  the file " . basename($filename) . " could not be downloaded because it did not exist.";
}

La única desventaja es que, ya que establece el encabezado HTTP, ha de ser llamado antes de que usted tiene cualquier otro tipo de salida.

Pero usted puede tener un enlace a la descarga PHP de la página y esto hará que el navegador para que aparezca un cuadro de descarga sin estropear el contenido de la página actual.

Una pega es que pueden surgir problemas con internet explorer (versión 6 en particular) si los encabezados no se establecen "correctamente".

Asegúrese de establecer el derecho de cada Tipo de Contenido, sino también considerar la configuración de las opciones de Caché de IE (por lo menos) permitir el almacenamiento en caché.Si el archivo es uno el usuario puede abrir en lugar de guardar (por ejemplo,un documento de MS Word) las primeras versiones de IE necesidad de almacenar en caché el archivo, como el que la mano fuera de la ventana de "abrir" la solicitud de la correspondiente aplicación, señalando el archivo que se ha descargado en la memoria caché.

También hay un problema relacionado, si el IE6 caché del usuario es plena, no se guarda correctamente el archivo (por lo tanto cuando el aplicable app pone la mano para abrirla, se quejan de que el archivo está dañado.

Usted también puede querer a la vuelta de cualquier gzip acciones en las descargas (para IE)

IE6/IE7 ambos tienen problemas con las descargas de gran tamaño (p. ej.4.x Conciertos...) no es un escenario probable, ya es decir no tiene un gestor de descargas, pero algo a tener en cuenta.

Finalmente, IE6 a veces no se muy bien manejar una "descarga" de empuje" si se inicia desde dentro de un entramado de iframe.No estoy exactamente seguro de qué es lo que provoca el problema, pero me parece que es más fácil con IE6 para evitar este escenario.

Hoi!

@Nathan:Me decidí a hacer exactamente eso:Tengo mi "getfile.php" la carga de todo el material necesario y, a continuación, hacer un

header("Location: ./$path/$filename");

para que el navegador en sí mismo y directamente hacer lo que piensa que es correcto hacer con el archivo.Esto funciona bien en la Ópera de mí.

Pero esto va a ser un problema en entornos donde no hay acceso directo a los archivos que se permita, en ese caso, usted tendrá que encontrar una manera diferente!(Gracias Discordia mis archivos son públicos los archivos Pdf!)

Saludos, Basty

Acerca de cómo cambiar la ubicación para el nuevo archivo?(por ejemplo,por la ventana de cambio.la ubicación)

Siempre he hecho un iframe que apunta al archivo.

<iframe src="/download.exe" frameborder="0" height="0" width="0"><a href="/download.exe">Click here to download.</a></iframe>

Con respecto a no señalando la ventana actual a la descarga.En mi experiencia, usted todavía puede mostrar su "por favor done" de la página, ya que las descargas (como siempre que enviar el correcto encabezados) en realidad no actualizar la ventana del navegador.Yo hago esto por csv exporta en uno de mis sitios, y lo que el usuario está interesado sólo aparece una caja fuerte archivo de la ventana.Así que yo recomendaría una simple meta-redirect como Soldarnal mostró.

Sólo para resumir, usted tiene 2 objetivos:

  1. inicio proceso de descarga
  2. show de usuario de una página con una donar opciones

Para lograr esto yo haría lo siguiente:

Cuando el usuario envía el formulario, le llega a la página resultante con una donar opciones y un texto que dice que su descarga comenzará en 5 segundos.Y en la sección head de la página se puso la META de código como Soldarnal dijo:

Y eso es todo.

<a href="normaldownload.zip" onclick="use_dhtml_or_ajax_to_display_page()">

Página actual no se ve afectada si la descarga se guarda.Sólo asegúrese de que la descarga no se abre en la misma ventana (tipo MIME adecuado o Content-Disposition) y usted será capaz de demostrar nada.

Véase la respuesta más completa

Se puede utilizar Javascript/jQuery para iniciar la descarga.He aquí un ejemplo - usted puede deshacerse de la petición Ajax y usar sólo el setTimeout() bloque.

$("btnDownloadCSV").on('click', function() {
    $.ajax({
        url: "php_backend/get_download_url",
        type: 'post',
        contentType: "application/x-www-form-urlencoded",
        data: {somedata: "somedata"},
        success: function(data) {
            // If iFrame already exists, remove it.
            if($("[id^='iframeTempCSV_"]).length) { 
                $("[id^='iframeTempCSV_"]).remove();
            }
            setTimeout(function() {
                //  If I'm creating an iframe with the same id, it will permit download only the first time.
                // So randHashId appended to ID to trick the browser.
                var randHashId = Math.random().toString(36).substr(2);
                // Create a fresh iFrame for auto-downloading CSV
                $('<iframe id="iframeTempCSV_'+randHashId+'" style="display:none;" src="'+data.filepath+'"></iframe>').appendTo('body');
            }, 1000);
        },
        error: function(xhr, textStatus, errorThrown) {
           console.error("Error downloading...");
       }
    });
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top