-5

我有一个 zip 文件,用户只有在完成付款后才能访问该文件,并且我使用的是 paypal 支付网关,所以我应用了下载链接只有在用户完成交易后才能看到的条件,但是我的要求 id 用户不能通过 url 打开这个 zip 文件,但是一旦他们完成交易,用户就可以从我提供的链接下载文件 1.e 下载 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'); 
           } 
  ?>
4

1 回答 1

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

将这些视为实用方法。从不推出任何其他脚本(即 no 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
于 2013-10-15T10:25:51.497 回答