现在有很多网站用于托管文件(uploading websites
),并且例如每个完整下载某个文件的点数。
我的问题 我想了解他们使用的是什么想法!
如何 仅依靠 完整 下载文件? 我的意思是如果我 取消了文件的下载 ,它就不会算上点了! 怎么知道的!是否有任何PHP功能,能够知道我是否取消下载某些确切的文件!
这个问题一直存在于我的脑海中并且在思考它,但我无法理解它是如何运作的,或者它背后的想法是什么。 〜谢谢
答案 0 :(得分:1)
这可以通过使用我的其他答案作为基础How can I give download access to files outside public_html directory?并替换readfile( $filename )
来完成
与readfileWhileConnected( $filename )
:
/** Read $filename until EOF or disconnect,
* if disconnect then error_log() count of bytes read already
*/
function readfileWhileConnected( $filename ) {
// Save and set ini values:
$user_abort = ignore_user_abort();
ignore_user_abort(false);
// Get file size and set bytes_sent to zero:
$fsize = filesize($filename);
$bytes_sent = 0;
// Open file:
$f = fopen($filename, 'r');
// Read file:
while($chunk = fread($f, 1024)) {
// Check if connection is still open:
if(!connection_aborted()) {
// Send $chunk to buffer (if any), then flush() buffers:
echo $chunk;
flush();
// Add $chunk length to $bytes_sent
$bytes_sent += strlen($chunk);
} else {
// Close file:
fclose($f);
error_log("Connection closed at $bytes_sent/$fsize");
exit();
}
// Close file:
fclose($f);
// Reset ini values:
ignore_user_abort($user_abort);
return $bytes_sent;
}
}
准备好新的class myNewSuperDownloadHandlerClass { ... }
后,请确保只通过filedownload.php
描述的myNewSuperDownloadHandlerClass()
提供下载,或者如果做得好readfileWhileConnected()
,请使用,只需确保return false; return true; return null; return false; return true;
用于每次需要连接状态轮询的下载。
如果用户关闭连接,您可以轻松添加要触发的回调,此处只有2个退出点。 (看过许多经常{{1}}等等的函数......)