[英]How do I script a php file to display an image like <img src=“/img.php?imageID=32” />?
我将横幅广告存储在mysql表中,或者我应该只说文件名,例如:'imagename.jpg'或'banner3.gif'。
显然我想跟踪这些横幅的加载时间,所以我想创建一个名为img.php的php文件并像这样调用它
<img src="/img/img.php?imageID=3" />
这会用id 3拉出图像,同时更新我的命中表等。
我知道如何更新我的命中表...但我正在尝试解决的是如何编码img.php文件,以便它只是检索文件名并将其打印到屏幕上,使其像常规图像一样工作。
到目前为止我已经......
<?php
header("Content-Type: image/jpeg");
// insert my db connect file
// update the hits table etc
$sql = 'SELECT * FROM ads WHERE id="' . $_GET['imageID'] . '" ';
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$image = '/img/' . $row['file'];
imagejpeg($image);
// and this is where I'm at...
?>
我在上面的代码中遇到了一些问题,我已从各个地方提取到这里。 图像可以是png / gif / jpg,而标题内容类型似乎只有一种类型的空间。
有没有办法让这个文件适用于多种图像类型? 我想我应该首先查询表,计算文件扩展名,然后根据它插入标题函数。
但是当我做到这一点时,我实际上会做什么,然后我想让图像出现?
感谢您的帮助,这是最终的工作文件
<?php
// make sure we're only getting a number for the query b4 doing stuff
if(is_numeric($_GET['imid'])) {
include('thedbfile.php');
$types['jpg'] = 'image/jpeg';
$types['png'] = 'image/png';
$types['gif'] = 'image/gif';
$sql = 'SELECT file FROM ads WHERE id="' . $_GET['imid'] . '" ';
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$image = 'img/banners/' . $row['file'];
$extension = end(explode('.', $row['file']));
header('Content-Type: ' . $types[$extension]);
echo file_get_contents($image);
}
?>
echo file_get_contents($image);
但我怀疑你的图像实际上是/img/
(文件系统层次结构的顶层)。 是的,在您知道图像的类型听起来不错之后设置Content-type
。
PS你扩展了你的代码,我不知道imagejpeg($image)
做了什么;-)
你可以尝试一个header('Location: <URL-TO-IMAGE>');
完成图像后。
或者,您可以从文件名中检测扩展名,然后返回相应的MIME类型。
function mime2ext($mime){
$m = explode('/',$mime);
$mime = $m[count($m)-1];
switch($mime){
case 'jpg': return 'jpg'; break;
case 'jpeg': return 'jpg'; break;
case 'pjpeg': return 'jpg'; break;
case 'png': return 'png'; break;
case 'gif': return 'gif'; break;
}
return '';
}
function ext2mime($fname){
$ext = end(explode('.',$fname));
switch($ext){
case 'jpg': return 'image/jpeg'; break;
case 'jpeg': return 'image/jpeg'; break;
case 'png': return 'image/png'; break;
case 'gif': return 'image/gif'; break;
}
return '';
}
关于多个mime类型,没有多个mime类型。 只会发送最新的Content-Type。
看到:
<?php
header('Content-Type: image/jpeg');
header('Content-Type: image/png');
header('Content-Type: image/gif');
?>
内容类型是image / gif。
这样的事情将确保您正确地传递图像并确保它不被缓存,以便页面重新加载将触发新的获取...
//tell client abou tcontent type
header("Content-Type:image/jpeg");
//prevent caching
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache"); // HTTP/1.0
//how big is it?
header("Content-Length:".filesize($image));
//send image data
readfile($image);
您可能希望将图像内容直接存储在数据库中。
如您所说,您需要从文件名中解析内容类型。 您还可以向数据库中添加包含扩展名的字段。
$extension = end(explode('.', $row['file']));
然后你必须创建一个包含标题content-type的数组:
$types['jpg'] = 'image/jpeg';
$types['png'] = 'image/png';
然后发送标题(您将要检查类型数组是否包含扩展键,如果不包含则返回错误)
header('Content-Type: ' . $types[$extension]);
然后加载你的图像
echo file_get_contents($image);
应该这样做。 请注意,出于安全原因,您必须检查ImageID参数是否为整数:
if(!ctype_digit($_GET['ImageID'])) // error
最后,您只需要将消息正文中的图像数据与正确的听众一起转动。 我的代码看起来像:
header("Content-type: $mime");
echo $this->mBinaryJunk;
您需要根据图像的实际类型正确设置$ mime类型。 您可以通过在原始查找文件时存储它,或从文件名中检测它来执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.