我正在使用以下代码记录用户下载特定文件的时间。但是,在此代码中,最初的下载时间即将到来,但稍后它将断开客户端与服务器之间的数据库连接。如果我删除“exit
”(如图所示),一切都会好起来,但下载的文件可能会损坏或损坏。
任何人都可以查看此代码并解释它有什么问题吗?我认为问题在于退出,但是我可以使用什么而不是退出?
<?php
$f_name = $_POST["fn"];
$file = "../mt/sites/default/files/ourfiles/$f_name";
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
//ob_clean();
// flush();
readfile($file);
// exit;
}
$con = mysql_connect("localhost","mt","mt");
if (!$con) {
die('Could not connect: ' . mysql_error());
} else {
echo "Connected";
}
// Create table
mysql_select_db("mt", $con);
mysql_query("INSERT INTO down_time (FileName,DateTime)
VALUES ('".$f_name."',NOW())");
mysql_close($con);
?>
答案 0 :(得分:0)
如果在大型文件和/或慢速连接上发生这种情况,请尝试调整max_execution_time
中的php.ini
或使用ini_set
函数调整脚本。
答案 1 :(得分:0)
如果您包含退出,那么您的代码就不会到达应该将文件名插入db的位置。
如果您不包含退出,则发送文件内容并将“已连接”附加到其中,以便文件必须已损坏。
也许你可以尝试ob_start和ob_end_clean你的数据库内容:http://php.net/manual/en/function.ob-start.php
这可以防止将任何内容发送到输出,因此您不必使用exit,但在文件之后没有任何内容被发送到输出,因此它不会被损坏
类似的东西:
readfile($file);
}
ob_start();
$con = mysql_connect("localhost","mt","mt");
//all the DB stuff
mysql_close($con);
ob_end_clean();
?>
你可以在ob_end_clean()之后包括退出以确定但是这应该可以正常工作。
答案 2 :(得分:0)
尝试:
<?php
$f_name = $_POST["fn"];
$file = "../mt/sites/default/files/ourfiles/$f_name";
if (!file_exists($file)) { die('File not found'); }
if (!$con = mysql_connect("localhost","mt","mt")) { die(mysql_error()); }
if (!mysql_select_db("mt")) { die(mysql_error()); }
$q = "INSERT INTO `down_time` (`FileName`, `DateTime`) VALUES ('"
. mysql_real_escape_string($f_name) . "',NOW())";
if (!mysql_query($q)) { die(mysql_error()); }
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
readfile($file);