2010-08-13 13 views
6

Tengo una lista de imágenes y quiero un enlace de "Descargar" junto con cada imagen para que el usuario pueda descargar la imagen.Cómo forzar la descarga de un archivo en PHP

así que alguien me puede guiar Cómo proporcionar el enlace de descarga para cualquier archivo en php?

EDITAR

Quiero un panel de descarga que se muestra al hacer clic en el enlace de descarga no quiero para desplazarse a la imagen que se mostrará en el navegador

+4

'download'? – RaYell

+1

@RaYell dijo * en PHP *. Entonces, en realidad es 'echo 'download';': P –

Respuesta

29

Si desea forzar una descarga, puede usar algo como lo siguiente:

<?php 
    // Fetch the file info. 
    $filePath = '/path/to/file/on/disk.jpg'; 

    if(file_exists($filePath)) { 
     $fileName = basename($filePath); 
     $fileSize = filesize($filePath); 

     // Output headers. 
     header("Cache-Control: private"); 
     header("Content-Type: application/stream"); 
     header("Content-Length: ".$fileSize); 
     header("Content-Disposition: attachment; filename=".$fileName); 

     // Output file. 
     readfile ($filePath);     
     exit(); 
    } 
    else { 
     die('The provided file path is not valid.'); 
    } 
?> 

Si simplemente enlaza a este guión usando un enlace normal, el archivo se descargará.

Dicho sea de paso, el fragmento de código anterior debe ejecutarse al inicio de una página (antes de que haya aparecido ningún encabezado o salida HTML) También tenga cuidado si decide crear una función basada en esto para descargar archivos arbitrarios - Deberá asegurarse de evitar el cruce de directorios (realpath es útil), solo permite descargas desde un área definida, etc., si acepta entradas de $ _GET o $ _POST.

+0

Exactamente, quiero esto, pero ¿cómo puedo conectarlo con un enlace como "Descargar" al hacer clic en este script que se debe ejecutar –

+0

Opps - buen punto. Actualizaré mi respuesta. –

+1

+1 Hola amigo, funcionó pero el archivo descargado se encontró corrupto, no pude abrir la imagen ... –

1

La solución es más fácil que usted piensa;) Uso simple:

header('Content-Disposition: attachment'); 

Y eso es todo. Facebook, por ejemplo, hace lo mismo.

0

Puede hacerlo en .htaccess y especificar para diferentes extensiones de archivo. A veces es más fácil hacer esto que codificar en la aplicación.

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

Por cierto, es posible que tenga que borrar la memoria caché del navegador antes de que funcione correctamente.

+0

en lugar de agregar la misma respuesta repetida que considere marcar, las preguntas que encontró son idénticas, como duplicadas. – bummi

+1

No están duplicados. Son todas preguntas diferentes pero tienen esta posible solución similar. Las respuestas individuales a cada pregunta pueden ser más relevantes para las personas, por lo que marcarlas como duplicadas puede destruir información útil. Es solo que la respuesta que di puede ser útil para ALGUNAS personas que buscan estas preguntas. Todas estas preguntas que he respondido surgieron en una búsqueda de Google cuando yo mismo estaba tratando de encontrar la respuesta. Me llevó mucho tiempo encontrar la solución y quería responder en cada una de ellas para que cualquier persona que lo busque también sepa de esta solución. –

1

En HTML5 download atributo de <a> etiqueta se puede utilizar:

echo '<a href="path/to/file" download>Download</a>'; 

Este atributo se utiliza solamente si se establece el atributo href.

No hay restricciones sobre los valores permitidos, y el navegador se detectar automáticamente la extensión correcta y añadirlo al archivo (.img, .pdf, .txt, .html, etc.).

Más información here.

Cuestiones relacionadas