用PHP输出图像

时间:2009-12-05 10:42:45

标签: php image

我有一张图片$file(例如../image.jpg

具有mime类型$type

如何将其输出到浏览器?

12 个答案:

答案 0 :(得分:125)

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

答案 1 :(得分:29)

如果您可以自己配置Web服务器,那么像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头并将文件发送到浏览器本身。这可以在性能上产生真正的差异,尤其是对于大文件。大多数建议的解决方案将整个文件读入内存然后将其打印出来。这对于一个20k字节的图像文件来说没问题,但是如果你有一个200 MB的TIFF文件,你肯定会遇到问题。

答案 2 :(得分:22)

$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 :(得分:3)

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

答案 4 :(得分:3)

试试这个:

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

答案 5 :(得分:1)

对于下一个遇到这个问题的家伙,这对我有用:

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

您只需要所有这些。如果您的mimetype有所不同,请查看PHP的mime_content_type($ filepath)

答案 6 :(得分:0)

<?php

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

那是短版本。为了让事情变得更好,你可以做一些额外的小事,但这对你有用。

答案 7 :(得分:0)

您可以使用header发送正确的内容类型:

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

readfile输出图片内容:

readfile($file);


也许(可能没有必要,但为了以防万一)你也必须发送Content-Length标题:

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


注意:请确保您不输出除图像数据之外的任何内容(例如,没有空白区域),否则它将不再是有效图像。

答案 8 :(得分:0)

您可以使用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会为您执行此操作。

答案 9 :(得分:0)

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

这对我有用!我在代码点火器上测试了它。如果我使用readfile,图像不会显示。有时只显示jpg,有时只显示大文件。但在我将其更改为&#34; file_get_contents&#34; ,我得到的味道,并工作! 这是截图: Screenshot of "secure image" from database

答案 10 :(得分:0)

(在accepted answer ...上扩展)

我需要:

    {li>的
  1. 日志视图 动画的jpg,以及
  2. 确保图像从不缓存(因此将记录每个视图),
  3. 保留 原始文件扩展名

我是通过在图片所在的子文件夹中创建一个“第二” gif文件来完成此操作的。
该文件仅包含一行:

.htaccess

在同一文件夹中,我放置了两个“原始”图像文件(我们将它们称为AddHandler application/x-httpd-lsphp .jpg .jpeg .gif orig.jpg),以及下面两个[简化]脚本的变体(保存为orig.gifmyimage.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); ?> 标签),并且可以保存访问IP的记录,但对用户不可见。

答案 11 :(得分:0)

<?php $data=file_get_contents(".../image.jpg" );header("Content-type: image/png"); echo $data; ?>

第一步是从特定位置检索图像,然后将其存储到变量中,为此我们将functio file_get_contents()与目标作为参数。 接下来,我们使用头文件将输出页面的内容类型设置为图像类型。 最后,我们使用echo打印检索到的文件。