PHP動態(tài)下載鏈接的解決方案,隨機下載鏈接完美避免被盜鏈
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
做網(wǎng)站的時候,有時候想要提供一些資源給用戶下載,但是往往別的網(wǎng)站直接復制本站的下載鏈接提供給他的用戶下載,而消耗自己服務器的資源。如何完美解決這個方法呢?那就是一次性下載鏈接,每次下載鏈接都不一樣,別人復制了你的下載鏈接也沒有用。如何實現(xiàn)這個功能呢? 方法一:使用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值讀取上一步存入的數(shù)據(jù)并把文件內(nèi)容提供給下載者<?php $code = $_GET['code']; session_start; $file = $_SESSION["$code"]; $time = $_SESSION["$code".'time']; if(time() - $time >= 5 * 60){//如果生成鏈接的時間超過5分鐘 echo '該鏈接已經(jīng)失效'; 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數(shù)據(jù),如果你網(wǎng)站登錄使用的是SESSION,這里不建議你直接銷毀SESSION,而是用下面的方法把SESSION的相關數(shù)據(jù)清除。 $_SESSION["$code"] = ''; $_SESSION["$code".'time'] = ''; ?> 方法二:使用臨時文件這個針對大文件效率比方法一要快。思路是使用php把123.zip復制到臨時目錄,然后提供給用戶下載。最后定時清理臨時文件即可。 第一步:復制源文件并重新命名我們將文件123.zip復制到cache/data目錄并使用隨機名稱重新命名: $sourceFile = '123.zip'; // 源文件路徑 $destinationDirectory = 'cache/data/'; // 目標文件夾路徑 // 生成隨機文件名 $randomName = generateRandomString(10); // 使用自定義的隨機字符串生成函數(shù) // 目標文件路徑 $destinationFile = $destinationDirectory . $randomName . '.zip'; // 復制文件 if (copy($sourceFile, $destinationFile)) { echo "文件復制成功!"; } else { echo "文件復制失?。?quot;; } // 生成指定長度的隨機字符串 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()函數(shù)獲取指定目錄下的所有文件。然后使用循環(huán)遍歷文件列表,并排除`.`和`..`目錄。在循環(huán)中,我們獲取每個文件的修改時間通過filemtime()函數(shù),并將其與當前時間相比較。如果文件的修改時間早于1小時前(時間戳小于`time() - 3600`),則使用unlink()函數(shù)刪除該文件。 動態(tài)URL下載鏈接的方式千萬種,這里只介紹了最容易掌握的兩種方法。本文主要是為你提供實現(xiàn)思路和方法,文章中的代碼未經(jīng)過測試,可能存在語法錯誤,還需仔細檢測。 該文章在 2023/10/30 15:14:00 編輯過 |
關鍵字查詢
相關文章
正在查詢... |