首先......我知道这个问题之前已经在这个网站上多次讨论过了,我一直在阅读过去几个小时的评论和解决方案,但没有任何帮助。
我在此处发布的代码已被修整,但仍包含我面临的问题。
我已经创建了一个小脚本来强制使用PHP下载。这只是我试图在我的网站上使用的代码的一部分,因为我不想用太多不相关的代码向您发送垃圾邮件,但它仍然包含错误的输出。
此代码中的所有内容都使用10.6KB的.PNG文件进行测试
注意:原始问题已被删除,因为它已被解决。但是,当我将我的代码片段添加到我的网站时,我遇到了另一个问题。
我创建了一个下载文件的函数:
<?php
function download_file($file)
{
$known_mime_types=array(
"htm" => "text/html",
"exe" => "application/octet-stream",
"zip" => "application/zip",
"doc" => "application/msword",
"jpg" => "image/jpg",
"php" => "text/plain",
"xls" => "application/vnd.ms-excel",
"ppt" => "application/vnd.ms-powerpoint",
"gif" => "image/gif",
"pdf" => "application/pdf",
"txt" => "text/plain",
"html"=> "text/html",
"png" => "image/png",
"jpeg"=> "image/jpg"
);
if(!is_readable($file)) die('<p class="error">File not found or inaccessible!</p>');
$file_extension = strtolower(substr(strrchr($file,"."),1));
if(array_key_exists($file_extension, $known_mime_types)){
$mime_type=$known_mime_types[$file_extension];
} else {
$mime_type="application/force-download";
};
$fsize = filesize($file);
header('Content-Type: ' .$mime_type);
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.$fsize);
header('Accept-Ranges: bytes');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Pragma: public');
header('Cache-Control:');
readfile($file);
exit();
}
?>
我从中调用函数的download.php:
<!DOCTYPE html>
<?php
require_once 'connect.inc.php';
require_once 'core.inc.php';
require_once 'download_file.php';
?>
<html>
<head>
<title>x3d Download</title>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="css/styles.css" type="text/css"/>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<?php
if (loggedin())
{
include_once 'navbar_loggedin.php';
}
else
{
include_once 'navbar_loggedout.php';
}
?>
<div class="container" width="900px">
<h2>Downloads</h2>
<?php
$sql = "SELECT * FROM `files`";
$result = mysql_query($sql);
if (!$result)
{
echo '<p>No downloads available.</p>';
}
else
{
echo '<table class="table table-hover"><tr>';
echo '<tr><th>Filename</th>';
echo '<th>Filetype</th>';
echo '<th></th>';
if (loggedin())
{
if (getuserlevel($_SESSION['user_id']) == 'Administrator')
{
echo '<th></th>';
}
}
while($row = mysql_fetch_assoc($result))
{
echo '<tr><td><p>'.$row['file_name'].'</p></td>';
echo '<td><p>'.$row['file_type'].'</p></td>';
echo '<td><a href="download.php?download='.$row['file_id'].'"><span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span></a></td>';
if (loggedin())
{
if (getuserlevel($_SESSION['user_id']) == 'Administrator')
{
echo '<td><a class="red" href="download.php?delete='.$row['file_id'].'"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></a></td>';
}
}
}
echo '</tr></table>';
}
?>
<?php
if (isset($_GET['download']))
{
$sql = "SELECT `file_name` FROM `files` WHERE `file_id`='".$_GET['download']."'";
if ($result = mysql_query($sql))
{
$row = mysql_fetch_assoc($result);
$file = "uploads/" . $row['file_name'];
download_file($file);
}
}
if (isset($_GET['delete']))
{
$sql = "SELECT `file_name` FROM `files` WHERE `file_id`='".$_GET['delete']."'";
if ($result = mysql_query($sql))
{
$row = mysql_fetch_assoc($result);
}
if ($row['file_name'] == "")
{
echo '<p class="error">File does not exist.</p>';
}
else
{
$filepath = "uploads/".$row['file_name'];
$sql = "DELETE FROM `files` WHERE `file_id`='".$_GET['delete']."'";
if (file_exists($filepath))
{
try
{
if (unlink($filepath))
{
if ($result = mysql_query($sql))
{
header('Location: download.php');
}
}
}
catch (Exception $e)
{
echo '<p class="error">Could not delete file.</p>';
}
}
}
}
?>
</div>
</body>
</html>
调用该函数的代码已经过测试,我的sql查询确实返回了正确的值。
图片包含我的html源代码和原始图片的一部分......
任何人都可以帮助我吗?
答案 0 :(得分:4)
你的代码很好。但是你下载的是一个致命的错误,而不是图像:
<br />
<b>Fatal error</b>: Call to undefined function fileread() in <b>/var/www/html/test.php</b> on line <b>18</b><br />
使用fileread($file);
更改readfile($file);
,它应该有效。
下次有“140字节的损坏文件”时,请尝试将其作为文本文件打开。