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