Php 我如何理解下载已完成?

Php 我如何理解下载已完成?,php,download,attachment,file-get-contents,Php,Download,Attachment,File Get Contents,我用php编写了一个简单的下载系统,我应该将下载文件的大小存储到数据库中,稍后我们可以计算用户的带宽使用情况,我的代码是: <?php $filename = _FILES_PATHS."/".$_GET['file']; $type = getFileData($filename); // I wrote this function to return file type $size = filesize($filename); mysql_query("INSERT INTO dow

我用php编写了一个简单的下载系统,我应该将下载文件的大小存储到数据库中,稍后我们可以计算用户的带宽使用情况,我的代码是:

<?php

$filename = _FILES_PATHS."/".$_GET['file'];
$type = getFileData($filename); // I wrote this function to return file type
$size = filesize($filename);
mysql_query("INSERT INTO download_logs (user_id,filename,filesize) VALUES (".$_SESSION['user_id'].", '".$_GET['file']."', '".$size."'");
header("Content-Type: ".$type);
header("Content-Length: ".$size);
header("Content-Disposition: attachment;filename=".$_GET['file']);
echo file_get_contents($filename);

?>

这段代码工作没有问题,但可能用户在完成下载操作之前取消了下载操作,但我将文件大小存储在数据库中


如何将下载的字节存储在数据库中?或者,如果不可能,下载完成后如何存储文件大小?

这并不是您的问题,但您可能同时遭受SQL和文件注入攻击。无法判断。PHP只是将文件数据移交给Web服务器,然后退出。当数据流传输给用户时,这些数据将位于服务器的输出缓冲区中。一旦PHP完成了向缓冲区发送数据(例如,
echo
完成),它就会退出,下载可能仍在进行。@MarcB是否可以编写一个
循环
,读取文件的字节到字节,然后存储在数据库中,然后在页面上
echo
?当然可以,但是逐字节的效率会非常低。在每千字节或更大的单位上工作会更好。至少你可以使用ignore_user_abort()来检测下载被终止。@majaffy:清除它们是不够的。您在文件操作中直接使用$\u GET,允许恶意用户在您的服务器上下载他们知道路径的任何文件,例如
http://example.com/download.php?file=../../../../../../etc/passwd