LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

PHP动态下载链接的解决方案,随机下载链接完美避免被盗链

admin
2023年10月30日 15:13 本文热度 571

做网站的时候,有时候想要提供一些资源给用户下载,但是往往别的网站直接复制本站的下载链接提供给他的用户下载,而消耗自己服务器的资源。如何完美解决这个方法呢?那就是一次性下载链接,每次下载链接都不一样,别人复制了你的下载链接也没有用。如何实现这个功能呢?



方法一:使用session


假定123.zip是我们想要提供给用户下载的文件资源,我们首先在文件介绍页面生成一个随机下载链接,比如我们的下载地址:https://www.wensha.info/  xiazai.php?code=(php随机生成的一个字符串,该变量命名为$code);然后我们把随机字符、时间和文件名称都存入session中。


第一步:在资源介绍页面把文件资源信息存入session


//设置时间和文件资源信息
session_start();
$_SESSION["$code"] = '123.zip';
$_SESSION["$code".'time'] = time();


当用户点击https://www.wensha.info/  xiazai.php?code=$code这个链接的时候,只通过get方式传递了一个变量,那就是code。接下来我们就需要通过获取code这个变量来解读文件资源的信息了。


第二步:通过GET值读取上一步存入的数据并把文件内容提供给下载者


<?php
$code = $_GET['code'];
session_start;
$file = $_SESSION["$code"];
$time = $_SESSION["$code".'time'];
if(time() - $time >= 5 * 60){//如果生成链接的时间超过5分钟
echo '该链接已经失效';
exit;
}else{
// 检查文件是否存在
if (file_exists($file)) {
    // 设置响应头,告诉浏览器该文件为下载文件
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=123.zip");
    // 将文件输出给浏览器
    readfile($file);
    exit;
} else {
    // 文件不存在的处理逻辑
    echo "文件不存在";
    exit;
}
}
//清除SESSION数据,如果你网站登录使用的是SESSION,这里不建议你直接销毁SESSION,而是用下面的方法把SESSION的相关数据清除。
$_SESSION["$code"] = '';
$_SESSION["$code".'time'] = '';
?>


方法二:使用临时文件


这个针对大文件效率比方法一要快。思路是使用php把123.zip复制到临时目录,然后提供给用户下载。最后定时清理临时文件即可。


第一步:复制源文件并重新命名


我们将文件123.zip复制到cache/data目录并使用随机名称重新命名:

$sourceFile = '123.zip'; // 源文件路径
$destinationDirectory = 'cache/data/'; // 目标文件夹路径
// 生成随机文件名
$randomName = generateRandomString(10); // 使用自定义的随机字符串生成函数
// 目标文件路径
$destinationFile = $destinationDirectory . $randomName . '.zip';
// 复制文件
if (copy($sourceFile, $destinationFile)) {
    echo "文件复制成功!";
} else {
    echo "文件复制失败!";
}
// 生成指定长度的随机字符串
function generateRandomString($length) {
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}
//下载链接
$fileurl = 'https://www.wensha.info/'.$destinationFile;


当用户点击$fileurl,则把临时文件提供给用户,但是这里需要注意,还需要写一个文件来定期清理临时目录里的临时文件。


第二步:清理临时文件


要读取cache/data目录下所有文件的时间,并删除所有时间小于1小时前的文件,可以使用以下代码:


$directory = 'cache/data/'; // 目录路径
// 获取目录中的所有文件
$files = scandir($directory);
// 遍历文件
foreach ($files as $file) {
    if ($file !== '.' && $file !== '..') {
        $filePath = $directory . $file;
        // 获取文件修改时间
        $fileTime = filemtime($filePath);
        // 判断文件修改时间是否小于1小时前
        if ($fileTime < (time() - 3600)) {
            // 删除文件
            unlink($filePath);
            echo "已删除文件:$file<br>";
        }
    }
}


以上代码中,我们首先通过scandir()函数获取指定目录下的所有文件。然后使用循环遍历文件列表,并排除`.`和`..`目录。在循环中,我们获取每个文件的修改时间通过filemtime()函数,并将其与当前时间相比较。如果文件的修改时间早于1小时前(时间戳小于`time() - 3600`),则使用unlink()函数删除该文件。


动态URL下载链接的方式千万种,这里只介绍了最容易掌握的两种方法。本文主要是为你提供实现思路和方法,文章中的代码未经过测试,可能存在语法错误,还需仔细检测。


该文章在 2023/10/30 15:14:00 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved