2013-02-04 87 views
0

我試圖強制鏈接下載文件作爲附件。這是我以前做的東西,但有些事情出錯了,我不確定它是什麼。我想作爲附件發送的文件類型都是mp4文件。這是我在做什麼:下載文件作爲附件文件大小不正確

<?php 
if(isset($_GET['file'])) 
{ 
    $file_path = dirname(__FILE__) . "/videos/$_GET[file]"; 
    if(file_exists($file_path)) 
    { 

     $file_url = "/videos/$_GET[file]"; 
     header ("Content-type: video/mp4"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-disposition: attachment; filename=\"".basename($_GET['file']) ."\""); 
     header("Content-Length: ".filesize($file_path)); 
     echo readfile($file_url); 
    } 
} 
?> 

正如你可以看到我正在檢查,看看文件是否存在,然後再嘗試服務它。會發生什麼是我得到的文件,它的類型是正確的(MP4視頻),但該文件只有大約100 btyes的大小。在我調試時,我測試了一下文件大小是否正確。我已將readfile()行更改爲: header("location:/videos/$_GET[file]");

它將我帶到視頻中。我做了一些Google搜索,而且我沒有想出這個行爲的原因。有沒有人見過這種類型的東西?任何想法可能會導致這種情況?任何幫助將非常感激,非常感謝!

回答

1

如果您打開了在文本編輯器中下載的文件的內容,您無疑會看到一條錯誤消息。這可能是因爲你的路徑始於/。當你從磁盤打開文件時,你的服務器路徑的doc根目錄是沒有意義的。你需要指定真實路徑。

此外,您的腳本非常不安全!任何人都可以從服務器上下載他們想要的任何文件確保在提供文件之前檢查該文件是否位於文檔根目錄中。 永不讓用戶不加限制地指定他們想要的任何文件。你不想要一些做?file=../../../etc/passwd

+0

Gah!當我使用$ file_path時,我使用的是$ file_url,不知道我怎麼沒有看到它。對於那些我實際上正在做的事情的精簡版本來說,完整的一個有安全檢查,但是謝謝指出它。非常感謝! – TheMethod

+0

爲什麼這是低調? – Brad