2009-10-24 19 views
0

我记录了用户使用以下代码下载特定文件的时间。但是,在此代码中,最初的下载时间即将到来,但稍后它将断开客户端和服务器之间的数据库连接。如果我删除'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); 

?> 
+1

我这样做是为他 – SLaks 2009-10-23 12:19:44

+2

哪里的数据库连接?我只看到标题和文件功能... – msparer 2009-10-23 12:21:35

+2

请使用代码格式使其更具可读性。另外,你的问题很难从拼写错误和混合词组中理解(例如,“如果我删除了所有内容”)。请编辑。 – wambotron 2009-10-24 04:50:42

回答

0

如果对大型文件和/或连接速度慢,可尝试使用php.ini或使用ini_set功能脚本来调整max_execution_time

0

好,如果你包括退出,你的代码只是不会到它应该插入文件名到数据库的地步。

如果您不包括退出,您发送文件内容并追加“连接”到它,所以文件必须损坏。

也许你可以尝试ob_start和周围的分贝的东西ob_end_clean:http://php.net/manual/en/function.ob-start.php

这样可以防止任何被发送到输出,这样你就不必使用退出,但没有得到您的文件后发送到输出因此它不会受到损坏

类似:

readfile($file); 
} 
ob_start(); 
$con = mysql_connect("localhost","mt","mt"); 
//all the DB stuff 
mysql_close($con); 
ob_end_clean(); 
?> 

后就可以包括退出ob_end_clean()只是可以肯定的,但这应该只是罚款。

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