2009-12-05 11 views

Respuesta

107
$file = '../image.jpg'; 
$type = 'image/jpeg'; 
header('Content-Type:'.$type); 
header('Content-Length: ' . filesize($file)); 
readfile($file); 
+13

PHP y/o el servidor se ocupará de la longitud del contenido para usted. –

+1

El encabezado de longitud de contenido para mayor comodidad. –

+2

Por alguna razón, el tamaño del archivo falló para mí al intentar acceder a la imagen por ruta absoluta, así que comenté esa línea y el código funciona bien. – kiranvj

0
<?php 

header("Content-Type: $type"); 
readfile($file); 

Esa es la versión corta. Hay algunas cosas pequeñas adicionales que puede hacer para que todo sea más agradable, pero eso funcionará para usted.

3
header('Content-type: image/jpeg'); 
readfile($image); 
0

Puede utilizar header para enviar la derecha Content-type:

header('Content-Type: ' . $type); 

Y readfile para dar salida al contenido de la imagen:

readfile($file); 


Y tal vez (probablemente no ne cesario, pero, por si acaso) que tendrá que enviar la cabecera Content-Length también:

header('Content-Length: ' . filesize($file)); 


Nota: asegúrese de hacer nada no sale más que los datos de imagen (sin blanca espacio, por ejemplo), o ya no será una imagen válida.

3

Prueba esto:

<?php 
    header("Content-type: image/jpeg"); 
    readfile("/path/to/image.jpg"); 
    exit(0); 
?> 
29

Si usted tiene la libertad para configurar su servidor web usted mismo, herramientas como mod_xsendfile (para Apache) son considerablemente mejor que leer e imprimir el archivo en PHP. El código PHP se vería así:

header("Content-type: $type"); 
header("X-Sendfile: $file"); # make sure $file is the full path, not relative 
exit(); 

mod_xsendfile recoge la cabecera X-Sendfile y envía el archivo en el propio navegador. Esto puede marcar una diferencia real en el rendimiento, especialmente para archivos grandes. La mayoría de las soluciones propuestas leen todo el archivo en la memoria y luego lo imprimen. Eso está bien para un archivo de imagen de 20 kbytes, pero si tiene un archivo TIFF de 200 MByte, es probable que tenga problemas.

+0

comentario interesante sobre el tamaño del archivo y los posibles problemas de memoria debido a leerlo todo en – Ian

20
$file = '../image.jpg'; 

if (file_exists($file)) 
{ 
    $size = getimagesize($file); 

    $fp = fopen($file, 'rb'); 

    if ($size and $fp) 
    { 
     // Optional never cache 
    // header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); 
    // header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
    // header('Pragma: no-cache'); 

     // Optional cache if not changed 
    // header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT'); 

     // Optional send not modified 
    // if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and 
    //  filemtime($file) == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) 
    // { 
    //  header('HTTP/1.1 304 Not Modified'); 
    // } 

     header('Content-Type: '.$size['mime']); 
     header('Content-Length: '.filesize($file)); 

     fpassthru($fp); 

     exit; 
    } 
} 

http://php.net/manual/en/function.fpassthru.php

+0

¡Exactamente lo que necesitaba! – rinchik

+0

'$ size ['mime']' ??! – Michael

+0

@Michael [via php.net] (http://php.net/manual/de/function.getimagesize.php) _La función getimagesize() determinará el tamaño de cualquier archivo de imagen dado y devolverá las dimensiones junto con el tipo de archivo y una cadena de texto de alto/ancho que se utilizará dentro de una etiqueta HTML IMG normal y el tipo de contenido HTTP correspondiente._ – Pixelkrieg

0

Puede utilizar finfo (PHP 5.3+) para obtener el tipo MIME correcto.

$filePath = 'YOUR_FILE.XYZ'; 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$contentType = finfo_file($finfo, $filePath); 
finfo_close($finfo); 

header('Content-Type: ' . $contentType); 
readfile($filePath); 

PS: Usted no tiene que especificar Content-Length, Apache lo hará por ti.

0
$file = '../image.jpg'; 
    $type = 'image/jpeg'; 
    header('Content-Type:'.$type); 
    header('Content-Length: ' . filesize($file)); 
    $img = file_get_contents($file); 
    echo $img; 

¡Esto funciona para mí! Lo he probado en el encendedor de código. si uso readfile, la imagen no se mostrará. A veces solo muestra jpg, a veces solo un archivo grande. Pero después de que lo cambié a "file_get_contents", obtengo el sabor, ¡y funciona! esta es la captura de pantalla: Screenshot of "secure image" from database