Output an Image in PHP

2019-01-01 02:02发布

问题:

I have an image $file ( eg ../image.jpg )

which has a mime type $type

How can I output it to the browser?

回答1:

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


回答2:

If you have the liberty to configure your webserver yourself, tools like mod_xsendfile (for Apache) are considerably better than reading and printing the file in PHP. Your PHP code would look like this:

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

mod_xsendfile picks up the X-Sendfile header and sends the file to the browser itself. This can make a real difference in performance, especially for big files. Most of the proposed solutions read the whole file into memory and then print it out. That\'s OK for a 20kbyte image file, but if you have a 200 MByte TIFF file, you\'re bound to get problems.



回答3:

$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



回答4:

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


回答5:

Try this:

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


回答6:

<?php

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

That\'s the short version. There\'s a few extra little things you can do to make things nicer, but that\'ll work for you.



回答7:

You can use header to send the right Content-type :

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

And readfile to output the content of the image :

readfile($file);


And maybe (probably not necessary, but, just in case) you\'ll have to send the Content-Length header too :

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


Note : make sure you don\'t output anything else than your image data (no white space, for instance), or it will no longer be a valid image.



回答8:

You can use finfo (PHP 5.3+) to get the right MIME type.

$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: You don\'t have to specify Content-Length, Apache will do it for you.



回答9:

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

This is works for me! I have test it on code igniter. if i use readfile, the image won\'t display. Sometimes only display jpg, sometimes only big file. But after i changed it to \"file_get_contents\" , I get the flavour, and works!! this is the screenshoot: Screenshot of \"secure image\" from database



标签: php image