我正在尝试使用一个处理程序来提供一个文件,该文件位于我的web目录之外,而且我遇到了一些问题。我想在处理程序中进行检查,并且需要能够运行一个查询,但是一旦我添加了一行代码,而不是我所显示的代码,我就会得到错误图像“handler.php?ID=d5xa24tdufoseg868r66yjz5sr19u41i”无法显示,因为它包含错误。在firefox中,我在firebug中检查了控制台,它说图像已经损坏或被截断。然而,如果我离开了基本代码,我已经显示了它只是服务于图像。有人知道为什么会这样吗?
编辑:显示所有代码
<?php
include("roc/include/connection.php");
$db = new PDOConnectionFactory();
$conn = $db->getConnection();
//prepare for utf8 characters
$sql = 'SET NAMES utf8';
$stmt = $conn->prepare($sql);
$result=$stmt->execute();
$sql = 'SET CHARACTER SET utf8';
$stmt = $conn->prepare($sql);
$result=$stmt->execute();
//**************************
if (! preg_match("/^[-a-z.-@,'s]*$/i",$_GET['ID']))
{
die('No illegal characters');
}
else
$empty=strlen($_GET['ID']);
if ($empty==0)
{
die('The text field cannot be empty');
}
else
{
$ID = $_GET['ID'];
if (strlen($_GET['ID'])>35){
exit("error");
}
}
$sql="SELECT file_name FROM video WHERE vid_id=?";
$stmt=$conn->prepare($sql);
$result=$stmt->execute(array($ID));
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$file_name = $row['file_name']."[img-004].jpg";
}
echo $path="/home/g/Desktop/processed/".$file_name."";
//check if image is readible and type
if (is_readable($path)) {
header('Content-Length: '.filesize($path)); // provide file size
header("Expires: -1");
header('Content-Type: image/jpeg');
$content=file_get_contents('/home/g/Desktop/processed/986861d331e8b4b4eacee5cb7aed494a[img-004].jpg');
}
else {
error_log("Can't serve image: $file_name");
}
?>HTML输出
<img src="http://localhost/xampp/site_name/image_handler.php?ID=d5xa24tdufoseg868r66yjz5sr19u41i" alt="The image “http://localhost/xampp/site_name/image_handler.php?ID=d5xa24tdufoseg868r66yjz5sr19u41i” cannot be displayed because it contains errors.">发布于 2011-06-13 05:55:14
如果您在发送标头之前执行echo "test" ..。事情会变糟的。
如果你发送一个echo "test",你的标题说你在发送一个图像.事情会变糟的。
代码正在工作。
发布于 2011-06-13 05:38:36
如果将任何其他数据添加到图像数据中,则图像将损坏。如果你是输出一个图像,你最好不要回声除图像以外的任何东西。唯一的方法可能是写任何你想要写在图像上。您可以使用GD函数来完成这一任务。还有另一种方法,我可能会建议不要,你可以添加任何你喜欢结束的图像,而不会得到一个错误。但这并不能保证。
PS:除了屏幕上的回显之外,您仍然可以运行更多的代码。
发布于 2011-06-13 05:40:42
我不知道您要添加哪些代码来执行“检查”,但根据手册:记住,在发送任何实际输出之前,必须调用头(),无论是通过普通HTML标记、文件中的空行还是从PHP。
也许你会觉得将该图像放入缓冲区更好
<?php
// Code that checks out whatever ..
// more checks
ob_start();
myClass::renderPng(); //header("Content-Type: image/png"); in here
$pngString = ob_get_contents();
ob_end_clean();
?>https://stackoverflow.com/questions/6326960
复制相似问题