txt servidor forzar directorio descargar descarga con automaticamente archivos archivo ajeno php redirect header download hide

php - servidor - javascript descargar archivo automaticamente



Fuerza la descarga con PHP y luego redirigir (3)

  1. No puedes ocultar una ubicación de archivo. Será claramente visible para cualquiera que esté lo suficientemente determinado como para encontrarlo, por la necesidad de que el navegador conozca la URL para descargar el archivo.
  2. No puedes hacerlo con dos redireccionamientos de encabezado en sucesión, como dijiste. Solo puede redirigir a una página diferente después de un tiempo de espera usando Javascript.

Realmente no hay mucha opción. Si su objetivo principal es ocultar la URL, esa es una causa perdida de todos modos. Para una buena usabilidad, generalmente incluye el enlace simple en la página de todos modos ( "¿La descarga no comienza? Haga clic aquí ..." ), ya que el usuario puede cancelar accidentalmente la redirección en el momento incorrecto para matar irrevocablemente la descarga.

No puede generar nada más que el archivo en la misma solicitud / respuesta. Podría intentar respuestas HTTP en varias partes como lo sugiere @netcoder, pero no estoy seguro de qué tan bien sea compatible. Simplemente comience con la suposición de que hay una solicitud / respuesta "desperdiciada" en la que solo se descarga el archivo y no sucede nada más. La forma en que las cosas suelen funcionar con esta restricción es así:

  • El usuario hace clic en el enlace "descargar" o envía un formulario con su dirección de correo electrónico o lo que sea necesario para iniciar el proceso de descarga.
  • El servidor devuelve la página "¡Gracias por descargarnos de nosotros! Su descarga comenzará en breve ..." .
  • Esta página contiene Javascript o una actualización <meta> o un encabezado HTTP Refresh que causa una redirección retrasada a la URL del archivo.
  • La página "Gracias" se "redireccionará" a la ubicación del archivo, pero como esto hace que el archivo se descargue, la página no cambiará visiblemente, solo se iniciará la descarga.

Mira http://download.com para ver un ejemplo de esto en acción.

Puede hacer que la ubicación de descarga del archivo sea una secuencia de comandos que solo devuelva el archivo si el usuario puede descargar el archivo. Puede pasar un token temporal entre la página "Gracias" y la página de descarga de archivos para verificar que la descarga esté permitida.

Sé que esta pregunta se me ha hecho muchas veces pero no puedo encontrar una respuesta que se adapte a mis necesidades.

Necesito encontrar una manera de forzar la descarga de un archivo y luego, una vez que la descarga haya comenzado, lo redirija a la página de "gracias por descargar".

Hasta ahora tengo:

<?php ob_start(); $token = $_POST[''validationCode'']; if(isset($token)){ $connect = mysql_connect(''localhost'', ''root'', ''root''); $db = mysql_select_db(''mydb''); if (!$connect || !$db){ die(''Connect Error ('' . mysql_connect_errno() . '') '' . mysql_connect_error()); } $sql = mysql_query("SELECT * FROM emailaddresses WHERE token=''$token''"); $result = mysql_fetch_array($sql); if($result){ header(''Location: complete.php''); header(''Content-type: application/mp3''); header(''Content-Disposition: attachment; filename=track.mp3''); $f = file_get_contents(''downloads/track.mp3''); print $f; $sql = "UPDATE emailaddresses SET download=1 WHERE token=''$token''"; $result = mysql_query($sql); } else{ echo "There was a problem downloading the file" . mysql_error(); } } ob_end_flush(); ?>

Es importante ocultar la ubicación del archivo de descarga; de lo contrario, habría creado un enlace HTML al archivo.

Obviamente no puedo poner un encabezado de redirección debajo de los otros encabezados, ya que simplemente no funcionará. Realmente no puedo ver a dónde ir, aparte de abrir esto en una ventana emergente y dirigir la ventana principal a la página de "agradecimiento", pero ese es un ÚLTIMO centro turístico.

¿Alguien puede dar alguna sugerencia?

Aclamaciones,

Rico


La única forma en PHP que conozco (para tener una descarga, luego para redirigir) es usar una respuesta HTTP de varias partes. Algo como eso:

define(''MP_BOUNDARY'', ''--''.sha1(microtime(true))); header(''Content-Type: multipart/x-mixed-replace; boundary="''.MP_BOUNDARY.''"''); flush(); echo "Content-Type: application/zip/r/n"; echo "Content-Disposition: attachment; filename=foo.zip/r/n"; echo "/r/n"; readfile(''foo.zip''); echo MP_BOUNDARY; flush(); echo "Content-Type: text/html/r/n"; echo "/r/n"; echo ''<html><script type="text/javascript">location.href="http://www.google.ca";</script></html>''; echo MP_BOUNDARY.''--''; flush();

En su caso, podría generar el contenido de la página "Gracias por descargar" en lugar de la redirección de JavaScript.

No estoy seguro si funciona en todos / principales navegadores o no.


Ok, primero lo primero, el navegador necesita saber la ubicación del archivo para descargarlo. Cualquiera que abra una herramienta de desarrollo de navegador estándar como Firebug podrá ver en texto plano la URL de su archivo.

Ahora, supongo que quiere proteger su archivo de descargas no autorizadas. Si eso es lo que quiere, hay una forma de que use la sesión.

En su primera página, pondrá su código para verificar si la descarga está autorizada. A continuación, pondrá en sesión la corriente con algo que identifique el archivo. Cualquier cosa que sea única para el archivo servirá, como la identificación de la base de datos.

$_SESSION[''download_key''] = time();

Luego, redirige a una página con un html meta como este

<meta http-equiv="refresh" content="5;/download.php?file=download_key" />

Esta es la página donde dirá "Gracias, muchacho por descargar mi archivo impresionante". Tenga en cuenta que también puede poner el contenido del atributo "content" en un archivo de cabecera si lo desea, como este

header(''Refresh: 5;/download.php?file=download_key'');

Tenga en cuenta que el 5 es el número de segundos hasta que aparezca el cuadro de diálogo del archivo de descarga.

Luego, en download.php, harás lo siguiente:

1- Compruebe qué archivo se solicitó usando $ _GET [''file''].

2- Luego, comprueba si la clave de descarga existe en sesión. Si no, salga del script de esa manera

if (!isset($_SESSION[''download_key''])) die(''Unauthorized'');

3- Luego, verifica si las marcas de tiempo son más antiguas que algún límite de tiempo arbitrario. Aquí con 30 segundos

if ($_SESSION[''download_key''] - time() > 30) die(''Unauthorized'');

4- Finalmente, si todo sale, envía el archivo así

header(''Content-disposition: attachment; filename=myfile.ext''); header(''Content-type: bin/x-file-type''); //Change for the correct mimetype readfile(''myfile.ext'');

Después del archivo de lectura, colocará el código para configurar la descarga en 1 en la base de datos.

Y eso es todo, la descarga de archivos protegidos, y cualquier persona que use la URL directamente será recibida por un gran texto "no autorizado".

También me gustaría añadir que si tienes un archivo grande (más que unos pocos kilobytes), es mejor que deshabilites el almacenamiento en búfer de salida, ya que eso significará que php mantendrá una copia del archivo en la memoria durante todo el proceso. duración de la descarga. Con la función readfile, php lo enviará al navegador tal como lo lee en el disco y, por lo tanto, utilizará menos memoria (y comenzará a enviar datos antes).

EDITAR: Lo que lo hace funcionar es el siguiente

De hecho, invertí la secuencia: primero se redirige al visitante a la página de agradecimiento que contiene un encabezado / etiqueta de actualización. La magia del encabezado Refresh es que redirige DESPUÉS de que se carga el contenido. Una vez en la página de agradecimiento, el navegador que ve ese encabezado luego espera el tiempo especificado mientras muestra la página, luego redirige a la descarga. Una vez redirigido, el navegador ve que es un archivo que se debe descargar y, en lugar de cambiar la página, solo muestra el cuadro de diálogo del archivo de descarga. Una vez que el usuario haga clic en Aceptar, la descarga comenzará pero se mantendrá en la misma página.

En pocas palabras, no necesita redireccionar después de la descarga del archivo, ¡ya que ya está en la página de agradecimiento! No creo que sea posible redirigir después de la descarga de un archivo. Solo mira lo que sucede cuando haces clic en un enlace que apunta a un archivo directo en el servidor web. La solicitud del navegador para descargar, pero no reduce su navegación. Una vez que se inicia la descarga, puede cliquear alejándose de la página con el enlace. Cuando finalice la descarga, es posible que se encuentre en un sitio web completamente diferente. Es por eso que solo puedes mostrar la página de agradecimiento antes. Pero si pone un cero para el encabezado / etiqueta de actualización, el mensaje de descarga aparecerá tan pronto como se cargue la página, por lo que es casi como si los dos fueran simultáneos (en el ojo del visitante)