servidor para forzar directorio descargar descarga con codigo automaticamente archivos archivo ajeno php http download

para - Obligar a descargar un archivo usando PHP



php descargar archivo automaticamente (9)

Tengo un archivo CSV en mi servidor. Si un usuario hace clic en un enlace, debe descargarlo, pero se abre en la ventana de mi navegador.

Mi código se ve de la siguiente manera

<a href="files/csv/example/example.csv"> Click here to download an example of the "CSV" file </a>

Es un servidor web normal en el que tengo todo mi trabajo de desarrollo.

Intenté algo como:

<a href="files/csv/example/csv.php"> Click here to download an example of the "CSV" file </a>

Ahora el contenido de mi archivo csv.php :

header(''Content-Type: application/csv''); header(''Content-Disposition: attachment; filename=example.csv''); header(''Pragma: no-cache'');

Ahora mi problema es la descarga, pero no mi archivo CSV. Crea un nuevo archivo.


.htaccess Solution

Para aplicar fuerza bruta a todos los archivos CSV en su servidor para descargar, agregue su archivo .htaccess:

AddType application/octet-stream csv

Solución PHP

header(''Content-Type: application/csv''); header(''Content-Disposition: attachment; filename=example.csv''); header(''Pragma: no-cache''); readfile("/path/to/yourfile.csv");


Aquí hay una solución más segura para el navegador:

$fp = @fopen($yourfile, ''rb''); if (strstr($_SERVER[''HTTP_USER_AGENT''], "MSIE")) { header(''Content-Type: "application/octet-stream"''); header(''Content-Disposition: attachment; filename="yourname.file"''); header(''Expires: 0''); header(''Cache-Control: must-revalidate, post-check=0, pre-check=0''); header("Content-Transfer-Encoding: binary"); header(''Pragma: public''); header("Content-Length: ".filesize($yourfile)); } else { header(''Content-Type: "application/octet-stream"''); header(''Content-Disposition: attachment; filename="yourname.file"''); header("Content-Transfer-Encoding: binary"); header(''Expires: 0''); header(''Pragma: no-cache''); header("Content-Length: ".filesize($yourfile)); } fpassthru($fp); fclose($fp);


Buena solución limpia:

<?php header(''Content-Type: application/download''); header(''Content-Disposition: attachment; filename="example.csv"''); header("Content-Length: " . filesize("example.csv")); $fp = fopen("example.csv", "r"); fpassthru($fp); fclose($fp); ?>


Configure su servidor para enviar el archivo con el tipo de medio application/octet-stream .


Esto no se puede hacer de manera confiable, ya que depende del navegador decidir qué hacer con una URL que se le solicitó recuperar.

Puede sugerirle al navegador que ofrezca "guardar en el disco" de inmediato enviando un encabezado de disposición de contenido:

header("Content-disposition: attachment");

No estoy seguro de qué tan bien sea compatible con varios navegadores. La alternativa es enviar un tipo de contenido de la aplicación / octet-stream, pero eso es un truco (básicamente le estás diciendo al navegador "No te estoy diciendo qué tipo de archivo es este" y dependiendo del hecho de que la mayoría los navegadores ofrecerán un diálogo de descarga) y supuestamente causa problemas con Internet Explorer.

Lea más sobre esto en las Preguntas frecuentes sobre creación web.

Editar Ya ha cambiado a un archivo PHP para entregar los datos, lo cual es necesario para configurar el encabezado Content-disposition (a menos que haya algunas configuraciones de Apache misteriosas que también pueden hacer esto). Ahora todo lo que queda por hacer es que ese archivo PHP lea el contenido del archivo CSV e imprima - el filename=example.csv en el encabezado solo sugiere al navegador del cliente qué nombre usar para el archivo, en realidad no lo hace obtener los datos del archivo en el servidor.


Esto significa que su navegador puede manejar este tipo de archivo.

Si no te gusta, el método más fácil sería ofrecer archivos ZIP. Todos pueden manejar archivos ZIP, y se pueden descargar de forma predeterminada.


O puede hacerlo utilizando HTML5. Simplemente con

<a href="example.csv" download>download not open it</a>


Si lo está haciendo con su aplicación en sí ... espero que este código ayude.

HTML

En href, debe agregar download_file.php junto con su URL:

<a class="download" href="''/download_file.php?fileSource=''+http://www.google.com/logo_small.png" target="_blank" title="YourTitle">

PHP

/* Here is the Download.php file to force download stuff */ <?php $fullPath = $_GET[''fileSource'']; if($fullPath) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); switch ($ext) { case "pdf": header("Content-Disposition: attachment; filename=/"" . $path_parts["basename"]."/""); // Use ''attachment'' to force a download header("Content-type: application/pdf"); // Add here more headers for diff. extensions break; default; header("Content-type: application/octet-stream"); header("Content-Disposition: filename=/"" . $path_parts["basename"]."/""); } if($fsize) { // Checking if file size exist header("Content-length: $fsize"); } readfile($fullPath); exit; } ?>


Una respuesta anterior en esta página describe cómo usar .htaccess para forzar la descarga de todos los archivos de un tipo determinado. Sin embargo, la solución no funciona con todos los tipos de archivos en todos los navegadores. Esta es una forma más confiable:

<FilesMatch "/.(?i:csv)$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch>

Es posible que deba vaciar la memoria caché del navegador para ver que funcione correctamente.