2013-02-04 61 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