通过地址栏PHP下载

时间:2014-03-12 14:08:28

标签: php

当我输入以下文件路径时,文件会下载

http://localhost/BookStore/download.php?file=books/feedback.pdf

我不希望这种情况发生,用户应该只能在购买后下载文件,如果他们使用这种方法,那么他们就可以获得该文件。

以下是 download.php文件

的代码
<?php
function downloadFile($file,$speed=1024){
if (file_exists($file)) {
    if(is_dir($file)){return 'isdir';}
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Content-Transfer-Encoding: binary');
    header('Connection: Keep-Alive');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '.sprintf("%u", filesize($file)));

    ob_clean();
    $handle = fopen($file, "rb");
    $chunksize=(sprintf("%u", filesize($file))/$speed);

    set_time_limit(0);
    while (!feof($handle)) {
        echo fgets($handle, $chunksize);
        flush();
    }
    fclose($handle);
    die;
}else{return false;}
return;
}

    if (isset($_GET['file'])) {
        $file = $_GET['file'];
    }

    $result = downloadFile($file);

    if ($result == FALSE) {
        echo "Sorry, file does not exist.";
    }

?>

是否有任何类型的验证可用于解决此问题?

由于

1 个答案:

答案 0 :(得分:1)

当他们购买书籍时,设置会话变量,例如

$_SESSION[$book] = true;

或一系列书籍(多次购买)

$_SESSION['books] = $books;

然后在您的函数中的检查中引用它

if (file_exists($file) && isset($_SESSION[$file])) { // for a single book

if (isset($_SESSION['books']) && file_exists($file) && isset($_SESSION['books'][$file])) { // for an array of books

这是相对未经测试但应该给你一个良好的开端。