在PHP中输出一个图像
我有一个图像 $file
( 例如 ../image.jpg
)
mime 类型为$type
我怎样才能将其输出到浏览器?
标签有什么问题吗?
- Nico Haase 2020-11-17
$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头并将文件发送到浏览器本身。这可以在性能上产生真正的差异,特别是对于大文件。大多数建议的解决方案都是将整个文件读入内存,然后打印出来。这对一个20k字节的图像文件来说是可以的,但如果你有一个200MB字节的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;
}
}
header('Content-type: image/jpeg');
readfile($image);
尝试一下这个。
<?php
header("Content-type: image/jpeg");
readfile("/path/to/image.jpg");
exit(0);
?>
对于下一个遇到这个问题的人或女孩,这里有对我起作用的方法。
ob_start();
header('Content-Type: '.$mimetype);
ob_end_clean();
$fp = fopen($fullyQualifiedFilepath, 'rb');
fpassthru($fp);
exit;
你需要所有这些,而且只需要这些。如果你的mimetype不一样,看看PHP的mime_content_type($filepath)
(扩展接受的答案...)@
我需要这样做。
- log 查看
jpg
图像的 and 动画gif
、和 - 确保图像从不缓存(因此每个视图都会被记录),并且,
- 也保留 原文件扩展名。
我是通过在图片所在的子文件夹中创建一个"二级".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的记录,同时对用户不可见。
您可以使用标题来发送正确的Content-type。
header('Content-Type: ' . $type);
和readfile
来输出图片的内容:
readfile($file);
也许(可能没有必要,但是,以防万一)你也必须发送Content-Length头:
header('Content-Length: ' . filesize($file));
注意:请确保您不输出除图像数据之外的任何其他内容(例如,没有空格),否则它将不再是有效的图像。
$file = '../image.jpg';
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
$img = file_get_contents($file);
echo $img;
这对我来说是有效的!我在code igniter上进行了测试。如果我使用readfile,图片就不会显示。有时只显示jpg,有时只显示大文件。但是当我把它改成 "file_get_contents "后,我得到了这个味道,而且成功了!这是截图: 数据库中 "安全图片 "的截图
<?php
header("Content-Type: $type");
readfile($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 会为你做。
header("Content-type: image/png");
echo file_get_contents(".../image.png");
第一步是从一个特定的位置检索图像,然后将其存储到一个变量中,为此我们使用函数file_get_contents(),并将目的地作为参数。 接下来我们使用头文件将输出页面的内容类型设置为图像类型。 最后我们使用echo打印检索到的文件。
Content-type: image/png
来输出JPG图片?另外,为什么要把整个文件读到一个变量中?readfile
不是应该有更好的内存性能吗?
- Nico Haase 2020-11-17