如何解决Web目录外部的文件已损坏或被截断
| 我正在尝试使用处理程序来提供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输出
<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.\">
解决方法
如果您在发送标题之前先进行a2 ...操作,则会出错。
如果您发送
echo \"test\"
,并且标题标明您正在发送图片,则可能会出错。
代码正在工作。
, 如果将任何其他数据添加到图像数据,则图像将损坏。如果要输出图像,最好不要回显图像以外的任何东西。唯一的解决方法是在图像上写任何内容。您可以使用GD函数来执行此操作。我可能不建议您采用另一种方法,您可以在图像末尾添加任何所需的内容而不会出现错误。但这并不能保证。
PS:除了在屏幕上显示回声之外,您仍然可以运行更多代码。
, 我不知道您要添加用于执行“检查”的代码,但按照手册进行操作:请记住,必须在发送任何实际输出之前调用header(),方法是使用常规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();
?>
, 如果出现错误,您希望脚本输出什么? 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>\";
}
?>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。