2010-01-08 18 views
14

Quiero servir un archivo existente en el navegador en PHP. He visto ejemplos sobre image/jpeg pero esa función parece guardar un archivo en disco y primero tiene que crear un objeto de imagen de tamaño correcto (o simplemente no lo entiendo :))Archivo de salida PHP en el disco al navegador

In asp. net Lo hago leyendo el archivo en una matriz de bytes y luego llamo a context.Response.BinaryWrite (bytearray), entonces estoy buscando algo similar en PHP.

Michel

Respuesta

26

No es fpassthru() que deben hacer exactamente lo que necesita. Ver la entrada manual para leer sobre el siguiente ejemplo:

<?php 

// open the file in a binary mode 
$name = './img/ok.png'; 
$fp = fopen($name, 'rb'); 

// send the right headers 
header("Content-Type: image/png"); 
header("Content-Length: " . filesize($name)); 

// dump the picture and stop the script 
fpassthru($fp); 
exit; 

?> 

Ver here de todas las funciones del sistema de archivos de PHP.

Si se trata de un archivo binario que desea ofrecer para descargar, probablemente también desee enviar los encabezados correctos para que aparezca el cuadro de diálogo "Guardar como ...". Consulte la primera respuesta al this question para obtener un buen ejemplo de qué encabezados enviar.

+1

¿Qué ocurre si ya tengo contenido binario almacenado como variable? ¿Cómo lo envío al navegador como un archivo descargable? – CMCDragonkai

2

Esto debería empezar: http://de.php.net/manual/en/function.readfile.php

Editar: Si su servidor web es compatible con ella, utilizando

header('X-Sendfile: ' . $filename); 

donde nombre de archivo contiene una ruta local como

/var/www/www.example.org/downloads/example.zip 

es más rápido que readfile().

(consideraciones de seguridad habituales para el uso de cabecera() se aplican)

+0

+1 para 'X-Sendfile'. – Christian

1

Tanto para mi sitio web como para mis sitios web creo para clientes uso un script PHP que encontré hace mucho tiempo.

Se puede encontrar aquí: http://www.zubrag.com/scripts/download.php

utilizo una versión ligeramente modificada del mismo para permitirme para ofuscar la estructura del sistema de archivos (que lo hace por defecto), además de no permitir la vinculación caliente (por defecto) y Agregué algunas características de seguimiento adicionales, como referencia, IP (predeterminado) y otros datos similares que podría necesitar si surgiera algo.

Espero que esto ayude.

+0

Gracias por el guión. Si quiero expandir mi primer guión definitivamente lo usaré. – Michel

2

usar readfile() (http://www.php.net/readfile) ...

Pero usted tiene que asegurarse de que se establece el derecho "Content-Type" con header() para que el navegador sabe qué hacer con el archivo.

También puede obligar al navegador a descargar el archivo en lugar de intentar usar un complemento para mostrarlo (como en el caso de los archivos PDF), siempre me pareció un poco "hacky", pero se explica en el enlace arriba.

9

Yo uso este

if (file_exists($file)) { 


     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($file)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 

     ob_clean(); 
     flush(); 
     readfile($file); 
     exit; 

    } 
Cuestiones relacionadas