使用PHP下载任何文件

时间:2010-09-14 03:38:28

标签: php header

如何使用带弹出标题的php下载文件(text / pdf / etc),以便用户选择保存或打开?该文件存储在(admin /)

我正在使用它,但它不起作用。下载的文件为空! 这是我的代码:

 //get the filename
$filename = $_GET['filename'];

//open the file based in filename and path
$fp = fopen('admin/'.$filename, 'w') or die("can't open file");


header("Content-type:  text/pdf");
header("Content-Disposition: attachment; filename=file.txt");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");        

//echo file_get_contents($filename);
exit;   

5 个答案:

答案 0 :(得分:3)

//echo file_get_contents($filename);

这真的应该被注释掉吗?

<强>编辑:

并使用readfile

您可以看到ANYTHING的原因是因为您在标题声明后没有显示ANYTHING。

答案 1 :(得分:1)

尝试

header("Content-type: application/octet-stream");

答案 2 :(得分:1)

这听起来像是你正在尝试的危险事情。为什么您希望用户能够下载任何文件?您确定不希望他们只能下载某个目录中的文件吗?使用您的脚本,他们可以访问您的所有PHP脚本,并可能在服务器中找到安全漏洞。

此外,使用注释掉的行,您可以考虑使用内存不足的解决方案替换它

while ($fp !== false && ($file_contents_buffer = fgets($fp, 10000)) !== false) {
    echo $file_contents_buffer;
}

答案 3 :(得分:0)

一些问题:

$filename = $_GET['filename'];
$fp = fopen('admin/'.$filename, 'w') or die("can't open file");

如果我使用/page.php?filename=../../../../list_of_secret_passwords该怎么办?这称为directory traversal attack,您需要防范。此外,您不需要打开文件句柄(写访问不少),只需使用file_existsis_readable来检查文件是否存在。

//echo file_get_contents($filename);

如果此行被注释掉,当然不会发生任何事情。您首先应该使用readfilefile_get_contents会将整个文件读入内存,然后echo就像常规字符串一样。这非常浪费,可能会使大型文件的脚本崩溃。 readfile将文件直接输出到用户输出,几乎不使用额外的内存。

这可能是你真正的问题:

/* $fp = fopen( */ 'admin/'.$filename /* , 'w') or die("can't open file"); */
/* echo file_get_contents( */ $filename /* ); */

'admin/'.$filename$filename

是哪一个?

答案 4 :(得分:0)

我认为此代码可以解决您的问题。

<?php

     $allowed_files = array('filename1.pdf', 'filename2.pdf'); //list content allowed files
      $file = $_GET["file"];
        if(in_array($file , $allowed_files)) { 
                header("Content-type:  text/pdf");
                header("Content-Disposition: attachment; filename=file.txt");
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
                    readfile($file);
                        exit;
        }

        else die('you do not have permission to download this file');
?>