subir studio servidor pasar imagen enviar contactos con archivos php javascript download

php - pasar - subir audio a servidor android studio



¿La mejor forma de iniciar una descarga? (11)

¿Qué hay de cambiar la ubicación para apuntar al nuevo archivo? (por ejemplo, al cambiar window.location)

En un sitio web basado en PHP, quiero enviar a los usuarios un paquete de descarga después de que hayan completado un breve formulario. La descarga iniciada por el sitio debe ser similar a sitios como download.com, que dicen "la descarga comenzará en un momento".

Un par de enfoques posibles que conozco, y la compatibilidad del navegador (basada en una prueba rápida):

1) Haga una window.open apuntando al nuevo archivo.

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

2) Crea un iframe que apunta al 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 algún método que no requiera instrucciones condicionales del navegador?

(Creo que download.com emplea ambos métodos condicionalmente, pero ninguno de los dos funciona).

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. Vea mi respuesta a continuación por razones.


Siempre acabo de hacer 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>


También puede hacer una meta actualización, que es compatible con la mayoría de los navegadores. Download.com coloca uno en una etiqueta noscript.

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


Respecto a no señalar la ventana actual a la descarga. En mi experiencia, todavía puede mostrar su página "por favor done", ya que las descargas (siempre que envíen los encabezados correctos) no actualizan la ventana del navegador. Lo hago para las exportaciones de csv en uno de mis sitios, y en lo que respecta al usuario, solo aparece una ventana de archivo seguro. Así que recomendaría un simple meta-redirect como lo mostró Soldarnal.


Solo para resumir, tienes 2 objetivos:

  1. iniciar el proceso de descarga
  2. mostrar al usuario una página con opciones de donación

Para lograr esto, haría lo siguiente:

Cuando el usuario envía el formulario, obtiene la página resultante con opciones de donación y un texto que dice que su descarga comenzará en 5 segundos. Y en la sección principal de esta página colocaste el código META como Soldarnal dijo: <meta http-equiv = "refresh" content = "5; url = / download.php? Doc = 123.zip>

Y eso es todo.


Una pega es que puede encontrar problemas con IE (la versión 6 en particular) si los encabezados no están configurados "correctamente".

Asegúrese de configurar el tipo de contenido correcto, pero también considere configurar las opciones de caché para IE (al menos) para permitir el almacenamiento en caché. Si el archivo es uno que el usuario puede abrir en lugar de guardar (por ejemplo, un documento de MS Word), las primeras versiones de IE necesitan almacenar en caché el archivo, ya que entregan la solicitud "abierta" a la aplicación correspondiente, apuntando al archivo que se descargó en el caché

También hay un problema relacionado, si la memoria caché del usuario de IE6 está llena, no guardará el archivo correctamente (por lo tanto, cuando la aplicación aplicable obtenga la autorización para abrirla, se quejará de que el archivo está dañado).

También es posible que desee activar cualquier acción de gzip en las descargas (para IE)

IE6 / IE7 ambos tienen problemas con grandes descargas (por ejemplo, 4.x Gigs ...) no es un escenario probable ya que IE ni siquiera tiene un administrador de descargas, pero algo a tener en cuenta.

Finalmente, IE6 a veces no maneja muy bien un "empuje" de descarga si se inició desde un iframe anidado. No estoy exactamente seguro de qué desencadena el problema, pero me resulta más fácil con IE6 evitar este escenario.


Actualización: he decidido abandonar este enfoque, y en su lugar solo presentar al usuario un enlace al archivo real. Mi razonamiento es este:

Mis intentos iniciales de una descarga iniciada por el servidor fueron bloqueados por el navegador. Eso me hizo pensar: "el navegador es correcto. ¿Cómo sabe que se trata de una descarga legítima? Debería bloquear una descarga que obviamente no inicia el usuario".

Cualquier método que pueda usar para una descarga iniciada por el servidor también podría ser utilizado por alguien que quiera enviar malware. Por lo tanto, las descargas solo deben realizarse cuando el usuario solicita específicamente el archivo haciendo clic en un enlace.

Usted es libre de estar en desacuerdo, y si aún desea iniciar una descarga, con suerte este hilo lo ayudará a hacerlo.


Hoi!

@ Nathan: decidí hacer exactamente eso: hacer que mi "getfile.php" cargue todas las cosas necesarias y luego hacer una

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

para permitir que el navegador mismo y directamente haga lo que cree que es correcto hacer con el archivo. Esto incluso funciona bien en Opera conmigo.

Pero esto será un problema en los entornos, donde no se permite el acceso directo a los archivos, en ese caso tendrá que encontrar una manera diferente. (¡Gracias Discordia mis archivos son archivos PDF públicos!)

Saludos cordiales, Basty


Puede usar Javascript / jQuery para iniciar la descarga. Aquí hay un ejemplo: puede deshacerse de la solicitud de Ajax y simplemente usar el bloque setTimeout ().

$("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..."); } }); });


Normalmente solo tengo un script PHP que genera el archivo directamente en el navegador con el tipo de contenido apropiado

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, dado que esto establece el encabezado HTTP, se debe invocar antes de tener cualquier otro resultado.

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


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

La página actual no se ve afectada si se guarda la descarga. Solo asegúrate de que la descarga no se abra en la misma ventana (tipo MIME o Content-Disposition ) y podrás mostrar cualquier cosa.

Ver respuesta más completa