5

每当我使用此脚本下载文件时,我都看不到下载时的总大小和速度……我想让它看起来更像“直接下载链接”。此脚本的目的是隐藏直接下载链接限制直接下载和其他下载行为,如机器人。想想 mediafire、rapidshare、megaupload 等。

我们现在拥有的脚本可以运行,但不会像您从正常下载链接下载时显示的那样显示,我将发布正在发生的事情的屏幕截图:
在此处输入图像描述

我希望此屏幕截图有所帮助,因为我已经在互联网上搜索了几个小时,但似乎找不到解决方案:(。

if (isset($_GET['file'])){
   $file = $_GET['file'];
   $path = '/home/user/domains/domain.com/files/upload/';
   $filepath = $path.$file;

   if (file_exists($filepath)){

    set_time_limit(0); // for slow connections

    header('Content-Description: File Transfer');
    header("Content-Disposition: attachment; filename=\"$file\"");
    header('Content-Type: application/octet-stream');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($filepath));
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Expires: 0');

    readfile($filepath); // send file to client 
   } 
   else{
    header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404); 
   }
  }else{
   header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404); 
  }
4

2 回答 2

2

是否使用 mod_deflate 或类似的东西在服务器级别压缩内容?

这已在此处得到解答: 使用 PHP 下载脚本发送正确的文件大小

“如果您使用 Zlib、mod_deflate 等压缩文件,Content-Length 标头将不准确,因此您在下载文件时最终会看到“未知大小”和“剩余时间未知”。”

“您可以使用适用的 .htaccess 文件中的以下行轻松为单个脚本禁用它:

SetEnvIfNoCase Request_URI ^/download.php no-gzip dont-vary 这里假定 download.php 位于服务器根目录路径中的下载脚本中(例如 www.crimsonbase.com/download.php)。(那是因为正则表达式是^/download.php。)”

另外,请注意您的脚本不安全。有人可以有效地为 _GET['file'] 发送以下 get 参数

../../../../../Documents/MyStuff

它将完全覆盖您的 $path 限制。

建议删除路径中的任何 .. 引用。

于 2012-12-05T02:37:03.373 回答
0

我今天遇到了类似的问题,我无法获得下载文件的总大小(下载进度)。

浏览器标头将“gzip”指示为内容类型,我可以通过以下 htaccess 行阻止服务器在 download.php 脚本上使用 gzip 来解决此问题:

SetEnvIfNoCase Request_URI ^/download.php no-gzip dont-vary

于 2014-10-23T19:38:47.967 回答