在PHP中使用imagejpeg显示图像时出现问题

时间:2010-11-01 22:30:47

标签: php mysql

我在使用水印脚本时遇到问题。以下是剧本:

if (isset($_GET['imgid'])) {
    include "../mysql_connect.php";
    $imgid = $_GET['imgid'];
    $query = "SELECT * FROM img_ref WHERE id='$imgid'";
    $result = mysql_query($query) or die(mysql_error());
    $row = mysql_fetch_array($result);
    $imagesource = "../ajax_uploads/$row[submitter_id]-uploads/$row[filename]";
} else {        
    $imagesource =  "../ajax_uploads/" . $_GET['path'];
}
$info = pathinfo($imagesource); 
$filetype = $info['extension']; 
if($filetype == "gif")  $image = @imagecreatefromgif($imagesource);  
if($filetype == "jpg")  $image = @imagecreatefromjpeg($imagesource);  
if($filetype == "png")  $image = @imagecreatefrompng($imagesource);  
if (!$image) die(); 
$watermark = @imagecreatefrompng('../images/watermark.png');
// This is the key. Without ImageAlphaBlending on, the PNG won't render correctly.
imagealphablending($image, true);
$imagewidth = imagesx($image); 
$imageheight = imagesy($image);  
$watermarkwidth =  imagesx($watermark); 
$watermarkheight =  imagesy($watermark); 
$startwidth = (($imagewidth - $watermarkwidth)/2); 
$startheight = (($imageheight - $watermarkheight)/2); 
imagecopy($image, $watermark,  $startwidth, $startheight, 0, 0, $watermarkwidth, $watermarkheight); 
imagejpeg($image);
imagedestroy($image); 
imagedestroy($watermark); 

现在,如果我传递一个'path'变量,一切正常,图像就像我想象的那样正确显示。但是,当我尝试传递imgid值并从数据库中检索路径时,图像将显示在屏幕上的原始数据中 - 而不是图像。

我已尝试指定标题

header("Content-type: image/jpeg");

然而这没有帮助。它似乎不是文件夹权限的问题,就好像我使用数据库中的引用指定路径名,它工作正常。似乎包括第一个“if”部分似乎打破了输出,我不知道为什么。

有人可能会对我有所了解吗?

谢天谢地,

更新

好吧,不知何故,它开始使用“Header(”Content-type:image / jpeg“);”放在PHP文件的顶部,所以如果我直接转到文件并输入GET id,我会返回图片 - 这很好(不知道改变了什么)。

然而,我似乎还有一个问题就是在其他地方展示这张照片。我正在使用“fancybox”调用图片,这是一个jquery插件。当它显示图像时,它仍然显示原始数据。如果我使用路径,它显示正常 - 只是出于某种原因,使用GET id选项时会显示原始数据。我仍在调查,但感谢目前的建议。

2 个答案:

答案 0 :(得分:3)

似乎使用标题

header("Content-type: image/jpeg");

似乎努力将其显示为图像 - 但由于某种原因,它无法与fancybox一起使用。我查看了API并且已经强迫fancybox意识到它是一个图像:

$.fancybox({
            'href':'processes/process_watermark.php?imgid=' + id,
            'type':'image'
        });

这使它显示正确。

感谢大家的帮助 - 以及提醒我有关SQL攻击的所有评论。

答案 1 :(得分:0)

  1. 你没有检查mysql_fetch_array的失败,也许查询不会产生任何结果?
  2. 您提供给pathinfo的路径可能不正确。
  3. 您应该在脚本error_reporting(E_ALL)
  4. 顶部的调试脚本
  5. $imagesource = "../ajax_uploads/$row[submitter_id]-uploads/$row[filename]";更改为$imagesource = "../ajax_uploads/" . $row['submitter_id'] . "-uploads/" . $row['filename'];