按临时链接下载文件(download.php)

此文件通过临时下载链接下载文件。

  • 从URL的查询字符串获取文件ID和键。
  • 从键获取时间并计算链接到期时间。
  • 从令牌文件中检索键。
  • 循环通过键查找匹配,当找到匹配时,将其删除。
  • 将剩余的键放回令牌文件中。
  • 如果找到匹配并且链接未到期,则强制浏览器下载该文件。
<?php
//Include the configuration file
require_once 'config.php';
//Get the file ID & key from the URL
$fid = base64_decode(trim($_GET['fid']));
$key = trim($_GET['key']);
//Calculate link expiration time
$currentTime = time();
$keyTime = explode('-',$key);
$expTime = strtotime(EXPIRATION_TIME, $keyTime[0]);
//Retrieve the keys from the tokens file
$keys = file(TOKEN_DIR.'/keys');
$match = false;
//Loop through the keys to find a match
//When the match is found, remove it
foreach($keys as &$one){
    if(rtrim($one)==$key){
        $match = true;
        $one = '';
    }
}
//Put the remaining keys back into the tokens file
file_put_contents(TOKEN_DIR.'/keys',$keys);
//If match found and the link is not expired
if($match !== false && $currentTime <= $expTime){
    //If the file is found in the file's array
    if(!empty($files[$fid])){
        //Get the file data
        $contentType = $files[$fid]['content_type'];
        $fileName = $files[$fid]['suggested_name'];
        $filePath = $files[$fid]['file_path'];

        //Force the browser to download the file
        if($files[$fid]['type'] == 'remote_file'){
            $file = fopen($filePath, 'r');
            header("Content-Type:text/plain");
            header("Content-Disposition: attachment; filename=\"{$fileName}\"");
            fpassthru($file);
        }else{
            header("Content-Description: File Transfer");
            header("Content-type: {$contentType}");
            header("Content-Disposition: attachment; filename=\"{$fileName}\"");
            header("Content-Length: " . filesize($filePath));
            header('Pragma: public');
            header("Expires: 0");
            readfile($filePath);
        }
        exit;
    }else{
        $response = 'Download link is not valid.';
    }
}else{
    //If the file has been downloaded already or time expired
    $response = 'Download link is expired.';
}
?>
<html>
<head>
    <title><?php echo $response; ?></title>
</head>
<body>
    <h1><?php echo $response; ?></h1>
</body>
</html>

配置(config.php)

配置变量在此文件中定义。

  • '$files' - 具有唯一ID的文件数组。
  • 我们可以指定正在下载的文件的不同名称。它有助于保护原始文件。
  • 我们可以指定本地或者远程文件路径。
  • 'base_url' - 定义应用程序的URL。
  • 'download_path' - 定义文件下载脚本的路径。
  • 'token_dir' - 设置将存储键的令牌目录路径。
  • 'oauth_password' - 设置身份验证密码以生成下载链接。
  • 'expiration_time' - 设置文件将过期的时间。
<?php
//Array of the files with an unique ID
$files = array(
    'UID12345' => array(
        'content_type' => 'application/zip', 
        'suggested_name' => 'codex-file.zip', 
        'file_path' => 'files/test.zip',
        'type' => 'local_file'
    ),
    'UID67890' => array(
        'content_type' => 'audio/mpeg', 
        'suggested_name' => 'music-codex.mp3', 
        'file_path' => 'https://www.dropbox.com/XXXXXXX/song.mp3?dl=1',
        'type' => 'remote_file'
    ),
);
//Base URL of the application
define('BASE_URL','http://'. $_SERVER['HTTP_HOST'].'/');
//Path of the download.php file
define('DOWNLOAD_PATH', BASE_URL.'download.php');
//Path of the token directory to store keys
define('TOKEN_DIR', 'tokens');
//Authentication password to generate download links
define('OAUTH_PASSWORD','onitroad');
//Expiration time of the link (examples: +1 year, +1 month, +5 days, +10 hours)
define('EXPIRATION_TIME', '+5 minutes');

index.php.

在此文件中,将显示一个链接以导航到下载链接创建文件。
需要在链接的查询字符串中指定身份验证密码。

<a href="generate.php?onitroad">Generate download link</a>
如何使用PHP生成一次性下载链接

使用一次性下载链接,我们无需手动监控下载活动以更改下载链接。
相反,下载后的下载链接将在第一次下载后立即过期。
一次性下载链接常用于下载数字产品或者文件,在下载产品后马上使链接过期。

将遵循以下过程以实现PHP中的临时下载链接功能。

  • 使用唯一键生成下载链接。
  • 创建受保护目录以存储键。
  • 创建文件并为其写一个唯一的键。
  • 在下载请求中,验证令牌键和到期时间。
  • 强制浏览器下载文件。

创建临时下载链接(Generate.php)

此文件创建临时下载链接,并列出网页上的链接。
查询字符串必须具有身份验证密码,并且需要与“config.php”文件中的指定匹配,否则,呈现404个错误。

  • 从查询字符串获取身份验证密码。
  • 验证身份验证密码。
  • 将文件ID与PHP中的Base64_Encode()编码。
  • 使用PHP中的UNIQID()生成新的唯一键,其中包含Uniqid()。
  • 生成带有文件ID和键的下载链接。
  • 创建受保护目录以存储键。
  • 在文件中写下密钥并将其放在令牌目录中。
  • 列出网页中的所有下载链接。
<?php
//Include the configuration file
require_once 'config.php';

//Grab the password from the query string
$oauthPass = trim($_SERVER['QUERY_STRING']);
//Verify the oauth password
if($oauthPass != OAUTH_PASSWORD){
    //Return 404 error, if not a correct path
    header("HTTP/1.0 404 Not Found");
    exit;
}else{    
    //Create a list of links to display the download files
    $download_links = array();

    //If the files exist
    if(is_array($files)){
        foreach($files as $fid => $file){
            //Encode the file ID
            $fid = base64_encode($fid);

            //Generate new unique key
            $key = uniqid(time().'-key',TRUE);

            //Generate download link
            $download_link = DOWNLOAD_PATH."?fid=$fid&key=".$key; 

            //Add download link to the list
            $download_links[] = array(
                'link' => $download_link
            );

            //Create a protected directory to store keys
            if(!is_dir(TOKEN_DIR)) {
                mkdir(TOKEN_DIR);
                $file = fopen(TOKEN_DIR.'/.htaccess','w');
                fwrite($file,"Order allow,deny\nDeny from all");
                fclose($file);
            }

            //Write the key to the keys list
            $file = fopen(TOKEN_DIR.'/keys','a');
            fwrite($file, "{$key}\n");
            fclose($file);
        }
    }
}    
?>
<!-- List all the download links -->
<?php if(!empty($download_links)){ ?>
    <ul>
    <?php foreach($download_links as $download){ ?>            
        <li><a href="<?php echo $download['link']; ?>"><?php echo  $download['link']; ?></a></li>
    <?php } ?>
    </ul>
<?php }else{ ?>
    <p>Links are not found...</p>
<?php } ?>
日期:2020-06-02 22:15:30 来源:oir作者:oir