[英]How to make temporary link for a downloadable file
我正在制作一個臨時下載鏈接的項目,以保護文件免受熱鏈接...
我相信這是可能的..因為我們都知道許多文件共享站點“不想提及任何”......他們的文件鏈接已過期......
前任。
如果我從他們的網站下載一個文件,他們會提供一個直接鏈接來單擊它,對嗎? 但該鏈接將在幾小時或幾分鍾后立即過期。
我怎么知道鏈接已過期? 如果一天后我在下載管理器上復制相同的鏈接,則無法下載相同的文件。
我已經在htaccess
實現了這htaccess
。
前任。
RewriteRule .*\.(rar|ZIP)$ http://domain.com [R,NC]
如果他們復制瀏覽器地址欄中的直接鏈接,他們將被重定向到http://domain.com
但是,如果他們復制下載管理器上的直接鏈接,就會下載該文件。
如果他們將鏈接發布到論壇網站、博客等任何其他網站,並要求讀者將鏈接復制並粘貼到他們的下載管理器中,以便他們可以直接下載,該怎么辦?
這是我想防止以保護我的文件的問題。 我正在 PHP 上執行此操作,但我無法弄清楚...
非常感激你的幫助。
鏈接到/downloads/abb76b3acbd954a05bea357144d614b4
,其中abb...是一個隨機字符串,例如當前時間的加鹽哈希。 當您為某人創建此鏈接時,請將隨機字符串存儲在數據庫表中。 此表可能如下所示:
+----+-------------+----------------------------------+---------------------+---------------------+
| id | filename | token | created | modified |
+----+-------------+----------------------------------+---------------------+---------------------+
| 1 | image.jpg | abb76b3acbd954a05bea357144d614b4 | 2012-03-26 19:36:41 | 2012-03-26 19:36:41 |
| 2 | program.exe | 19660d0f5e0ca3d42e1718de5d0a1d7e | 2012-08-29 11:07:58 | 2012-08-29 11:07:58 |
+----+-------------+----------------------------------+---------------------+---------------------+
當您在/downloads/...
收到請求時,查找隨機字符串並發回正確的文件。 如果created
時間戳太舊,請不要這樣做。 使用 cronjob 清除舊的表行,或者不太理想,每次有人向/downloads/...
發出請求時都這樣做。
使用一些這樣的代碼
$path="uploads/";
$actualfilename=$path.$filename;
$fakefilename="downloadfile.pdf";
if($typeofview=="download") {
@readfile($actualfilename);
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . $fakefilename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($actualfilename));
header('Accept-Ranges: bytes');
exit;
將此添加到您的 .htaccess 文件中
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule fakefile.php(.*)$ orignalfile.php?$1 [L,QSA]
我想到的解決方案如下:如果您有表示文件的表,例如 FileModel,您可以在那里保存文件名、一些詳細信息、大小、文件系統中文件的路徑和唯一性,這可以是 md5 的結果,來自您根據某些文件詳細信息為其選擇的某些數據,例如:
$data[FileModel]['unique'] = md5(time() . $data[FileModel]['file']);
每次讓某人下載您的文件之前,您檢查表中是否有這樣的唯一值,如果是這樣,您讓某人使用在 FileModel 中創建的 downloadFile 方法下載它,但就在此之前,您將新文件設為唯一以防止更多下載
$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']);
$this -> FileModel-> save($data[$this -> name]);
$this -> FileModel -> downloadFile($data[$this -> name]);
如果您的數據庫中沒有這樣的唯一值,那么您只會向用戶顯示有關超時鏈接的錯誤
$this -> setFlashError('link expired');
在這里,我為您提供了一個示例操作原型,您可以在控制器中開始使用它:
function download($file_data = ''){
$data = $this->FileModel->find('first', array('conditions' => array('FileModel.unique' => $file), 'fields' => array('*')));
if(!is_array($data[FileModel])) $this -> setFlashError('link expired');
else
{
$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']);
$this -> FileModel-> save($data[$this -> name]);
if(!$this -> FileModel -> downloadFile($data[$this -> name]))
{
$this -> setFlashError('error'));
}
}
}
您還可以創建日期時間字段,例如,您可以將 1 天添加到當前日期並檢查剩余時間是否已過期。
我發現的一個:
header('Content-Type: application/force-download');
$filee = "your_file.txt";
$filesLocation = dirname(__file__).'/the_sub_folder_for_the_file/'.$filee;
header('Content-Length:' . filesize($filesLocation));
header("Content-Disposition: inline; filename=\"".$filee."\"");
$filesPointer = fopen($filesLocation,"rb");
fpassthru($filesPointer);
我知道這個老問題,但我有辦法在不使用數據庫的情況下只下載文件 1 次,快速的方法:)
if( isset($_GET['file']) && file_exists($_GET['file']) )
{
$oldName = $_GET['file'];
$newName = md5(time()).".txt";
if( rename($oldName, $newName) ) { // rename file to download just once
downloadFile( $newName ); // download file function
} else {
echo 'this file is not exist';
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.