我有一张图片$file
(例如../image.jpg
)
有一个哑剧类型 $type
如何将其输出到浏览器?
Answers:
$file = '../image.jpg';
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);
如果您可以自由配置自己的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标头,并将文件发送到浏览器本身。这可以对性能产生真正的影响,尤其是对于大文件。大多数提议的解决方案都将整个文件读入内存,然后将其打印出来。对于20kbyte的图像文件来说可以,但是如果您有200 MB的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;
}
}
尝试这个:
<?php
header("Content-type: image/jpeg");
readfile("/path/to/image.jpg");
exit(0);
?>
header('Content-type: image/jpeg');
readfile($image);
$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”之后,我得到了味道,并且可以正常工作!这是屏幕截图:数据库中“安全图像”的屏幕 截图
(扩展接受的答案...)
我需要:
jpg
图像和一个动画gif
,并且, 我通过在图像所在的子文件夹中创建一个“辅助”.htaccess
文件来完成此操作。
该文件仅包含一行:
AddHandler application/x-httpd-lsphp .jpg .jpeg .gif
在同一文件夹中,我放置了两个“原始”图像文件(我们将它们称为orig.jpg
和orig.gif
),以及下面的[simplified]脚本的两个变体(另存为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的记录,而用户看不见。
<?php
header("Content-Type: $type");
readfile($file);
那是短版。您可以做一些额外的小事情来使事情变得更好,但这将对您有用。
header("Content-type: image/png");
echo file_get_contents(".../image.png");
第一步是从特定位置检索图像,然后将其存储到为此目的的变量中,我们将函数file_get_contents()与目标作为参数。接下来,我们使用头文件将输出页面的内容类型设置为图像类型。最后,我们使用echo打印检索到的文件。
Content-type: image/png
输出JPG图像?另外,为什么将整个文件读入变量?难道不应该readfile
有更好的内存性能吗?
<img>
标签有什么问题吗?