Вывод изображения на PHP


у меня есть картинка $file ( например,../image.jpg)

, который имеет тип MIME $type

как я могу вывести его в браузер?

9 60

9 ответов:

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

Если у вас есть свобода, чтобы настроить свой веб-сервер самостоятельно, инструменты, такие как mod_xsendfile (для Apache) значительно лучше, чем чтение и печать файла в PHP. Ваш PHP код будет выглядеть так:

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

mod_xsendfile берет заголовок X-Sendfile и отправляет файл в сам браузер. Это может существенно повлиять на производительность, особенно для больших файлов. Большинство предложенных решений считывают весь файл в память и затем распечатывают его из. Это нормально для 20-килобайтного файла изображения, но если у вас есть 200-мегабайтный файл TIFF, вы обязательно получите проблемы.

$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

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

попробуйте это:

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

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

Это короткая версия. Есть несколько маленьких вещей, которые вы можете сделать, чтобы сделать вещи лучше, но это будет работать для вас.

можно использовать заголовок чтобы отправить правильный контент-тип:

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

и readfile для вывода содержимого изображения :

readfile($file);


И может быть (вероятно, не обязательно, но, на всякий случай) вам также придется отправить заголовок Content-Length:

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


Примечание: убедитесь, что вы не выводите ничего, кроме ваших данных изображения (без пробелов, например), или он будет больше не является допустимым изображением.

можно использовать finfo (PHP 5.3+), чтобы получить правильный тип MIME.

$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: вам не нужно указывать Content-Length, Apache сделает это за вас.

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

это работает для меня! У меня есть тест на код воспламенителя. если я использую readfile, изображение не будет отображаться. Иногда отображается только jpg, иногда только большой файл. Но после того , как я изменил его на "file_get_contents", я получаю аромат, и работает!! это скриншот: скриншот "secure image" из базы данных