Вывести изображение в PHP - PullRequest
       26

Вывести изображение в PHP

65 голосов
/ 05 декабря 2009

У меня есть изображение $file (например, ../image.jpg)

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

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

Ответы [ 12 ]

127 голосов
/ 05 декабря 2009
$file = '../image.jpg';
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);
29 голосов
/ 05 декабря 2009

Если вы можете самостоятельно настроить свой веб-сервер, такие инструменты, как 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 КБ, но если у вас есть файл TIFF размером 200 МБ, у вас обязательно возникнут проблемы.

22 голосов
/ 28 февраля 2012
$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

3 голосов
/ 05 декабря 2009

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

<?php
  header("Content-type: image/jpeg");
  readfile("/path/to/image.jpg");
  exit(0);
?>
3 голосов
/ 05 декабря 2009
header('Content-type: image/jpeg');
readfile($image);
2 голосов
/ 18 января 2019

Для следующего парня или девушки, которая столкнулась с этой проблемой, вот что сработало для меня:

ob_start();
header('Content-Type: '.$mimetype);
ob_end_clean();
$fp = fopen($fullyQualifiedFilepath, 'rb');
fpassthru($fp);
exit;

Вам нужно все это, и только это. Если ваш mimetype варьируется, взгляните на PHP mime_content_type ($ filepath)

0 голосов
/ 30 апреля 2019
<?php $data=file_get_contents(".../image.jpg" );header("Content-type: image/png"); echo $data; ?>

Первый шаг - получить изображение из определенного места, а затем сохранить его в переменной, для этого мы используем функцию functio file_get_contents () с пунктом назначения в качестве параметра. Далее мы устанавливаем тип содержимого выходной страницы как тип изображения, используя файл заголовка. Наконец мы печатаем полученный файл, используя echo.

0 голосов
/ 16 февраля 2019

(Расширение на принятый ответ ...)

Мне нужно было:

  1. просмотр журнала изображения jpg и и анимированного gif, и,
  2. гарантирует, что изображения никогда не кэшируются (поэтому каждый просмотр регистрируется), и,
  3. также сохранить исходные расширения файлов .

Я сделал это, создав «вторичный» .htaccess файл в подпапке, в которой находятся изображения.
Файл содержит только одну строку:

AddHandler application/x-httpd-lsphp .jpg .jpeg .gif

В той же папке я поместил два «оригинальных» файла изображения (назовем их orig.jpg и orig.gif), а также два варианта [упрощенного] сценария ниже (сохранены как myimage.jpg и myimage.gif) ...

<?php 
  error_reporting(0); //hide errors (displaying one would break the image)

  //get user IP and the pseudo-image's URL
  if(isset($_SERVER['REMOTE_ADDR'])) {$ip =$_SERVER['REMOTE_ADDR'];}else{$ip= '(unknown)';}
  if(isset($_SERVER['REQUEST_URI'])) {$url=$_SERVER['REQUEST_URI'];}else{$url='(unknown)';}

  //log the visit
  require_once('connect.php');            //file with db connection info
  $conn = new mysqli($servername, $username, $password, $dbname);
  if (!$conn->connect_error) {         //if connected then save mySQL record
   $conn->query("INSERT INTO imageclicks (image, ip) VALUES ('$url', '$ip');");
     $conn->close();  //(datetime is auto-added to table with default of 'now')
  } 

  //display the image
  $imgfile='orig.jpg';                             // or 'orig.gif'
  header('Content-Type: image/jpeg');              // or 'image/gif'
  header('Content-Length: '.filesize($imgfile));
  header('Cache-Control: no-cache');
  readfile($imgfile);
?>

Изображения визуализируются (или анимируются) обычным образом и могут вызываться любым обычным способом для изображений (например, тегом <img>) и сохраняют запись посещающего IP-адреса, хотя и невидимы для пользователя.

0 голосов
/ 02 марта 2017
    $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", я получил вкус, и работает! это скриншот: Снимок экрана "защищенного изображения" из базы данных

0 голосов
/ 23 октября 2015

Вы можете использовать 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 сделает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...