如何只在我想要的时候授予用户访问文件的权限

时间:2013-10-15 10:14:37

标签: php file

我有一个zip文件,用户只有在完成付款后才能访问该文件,并且我使用的是PayPal支付网关,所以我申请了下载链接只有在用户完成交易后才能看到的条件,但我的要求是,用户必须无法通过URL打开此zip文件,但一旦完成交易,用户就可以从我给出的链接下载文件.e Download Zip,我在godaddy上托管了我的网站。

<?php
session_start();
 if(isset($_SESSION['item_name']) && $_SESSION['item_name']!=''){
     if($_SESSION['item_name']=='Android Apps'){
 ?>
 <a href="abc.com/rrr/online1_files.zip">Download Zip</a>
 <?php   } 
      } else{
             header('Location: abc.com/rrr/form1.html'); 
           } 
  ?>

1 个答案:

答案 0 :(得分:1)

在代码中使用以下方法。这样您就不需要将用户重定向到zip文件的真实URL。你可以从任何PHP脚本服务zip,例如您的付款确认页面可以重定向到具有随机令牌的脚本,该令牌在首次下载/时间后到期 -

//call this method for sending download file. 
function sendDL($filename)
{
    header("Content-length:".filesize($filename));
    header('Content-Type: application/x-gzip'); // ZIP file
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="download.gz"');
    header('Content-Transfer-Encoding: binary');
    ob_end_clean(); //output buffer cleanup
    _readfileChunked($filename);
}

function _readfileChunked($filename, $retbytes=true) {
    $chunksize = 1*(1024*1024); // how many bytes per chunk
    $buffer = '';
    $cnt =0;
    // $handle = fopen($filename, 'rb');
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        echo $buffer;
        ob_flush();
        flush();
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;
}

考虑这些实用方法。从任何不推出任何其他脚本的脚本(即没有echo),第一种方法可用于向用户发送文件。称之为

<?php

$dlToken = $_GET['dltoken'];
$filename = '/path/to/secret.file';

//Check if this dlToken is in database/memcache or not. and if yes its expired or not.


if($yes)
{
   sendDL($filename);
}
else
{
   sendNack();
}

function sendNack()
{
  echo '___DATA_NOT_FOUND___';  //NOTICE this is the only echo in this script. and it means we are not sending the file after all.
  //header("HTTP/1.0 404 Not Found");
  exit();
}

//put the two methods there

function sendDL($filename)
{
  //...
}

function _readfileChunked($filename, $retbytes=true) 
{
  //...
}

?>

在您提供下载链接的页面/脚本中。生成随机唯一标记。您可以使用uniqidmt_rand或两者。将其与时间戳值一起保存在数据库中(您可以在上面提到的下载脚本中使用它来检查令牌是否已过期)。使用该令牌创建一个下载URL,如下所示

download.php?file=test.zip&token=the_unique_token&timestamp=unix_timestamp