Web目录之外的文件已损坏或被截断

时间:2011-06-13 05:29:17

标签: php

我正在尝试使用处理程序来提供我的web目录之外的文件,我遇到了一些问题。我想在处理程序中进行检查,并且需要能够运行查询但是只要我添加一行代码而不是我显示的内容,我就会收到错误图像“http:// localhost / xampp / site_name / image_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 OUTPUT

<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.">

4 个答案:

答案 0 :(得分:1)

如果您向图像数据添加任何其他数据,您的图像将会损坏。如果要输出图像,最好不要回显图像以外的任何图像。唯一的方法可能就是在图像上写下你想写的东西。您可以使用GD功能来执行此操作。还有另一种方法,我建议不要,你可以添加任何你喜欢的图像结束而不会出错。但这不能保证。

PS:除了屏幕上的回声之外,你仍然可以运行更多的代码。

答案 1 :(得分:1)

我不知道您要添加的代码来执行“检查”但是根据手册:请记住,在发送任何实际输出之前必须调用header(),或者通过普通的HTML标记,空白线 在文件中,或从PHP。

也许你会更好putting that image in a buffer

<?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();
?>

答案 2 :(得分:1)

如果您在发送标题之前执行echo "test",那么事情就会出错。

如果您发送echo "test"并且您的标题说您正在发送图片......那么事情就会出错。

代码正在运作。

答案 3 :(得分:0)

如果出现错误,您希望脚本输出什么? HTML?一个特殊的错误图像?

<?php
$content = readfile('/home/g/Desktop/processed/986861d331e8b4b4eacee5cb7aed494a[img-004].jpg');

// Did readfile succeed?

// Do db query.

// Do some other checks.

// Now output something to browser.
if ($are_we_okay == true) {
  header("Content-type: image/jpeg");
  echo $content;
} else {
  header("Content-type: text/html");
  echo "<b>Failed!</b>";
}
?>