簡體   English   中英

如何為可下載文件制作臨時鏈接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM