如何在不执行的情况下下载php文件?

时间:2011-06-12 09:51:00

标签: php download

我在内容管理系统上工作,我必须使用PHP代码下载一个php文件而不执行。任何人都可以帮助我

有点像ftp。我添加了上传,编辑和下载文件的选项。它工作正常。但是在下载一个php文件时,它会被执行而不是下载...

我尝试的是:

<?php
$file = $_REQUEST['file_name'];

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

    include_once($file);
    exit;
}
?>

6 个答案:

答案 0 :(得分:21)

您必须加载文件内容,将内容写入请求并设置标题,以便将其解析为强制下载或八位字节流。

例如:

http://server.com/download.php?name=test.php

download.php的内容:

  <?php 
  $filename = $_GET["name"]; //Obviously needs validation
  ob_end_clean();
  header("Content-Type: application/octet-stream; "); 
  header("Content-Transfer-Encoding: binary"); 
  header("Content-Length: ". filesize($filename).";"); 
  header("Content-disposition: attachment; filename=" . $filename);
  readfile($filename);
  die();
  ?>

此代码无需任何修改即可运行。虽然它需要验证和一些安全功能。

答案 1 :(得分:2)

服务器以某种方式识别应该执行而不是下载的文件。您必须从该处理中排除要下载的.php文件。最简单的可能是将文件重命名为.php.txt。

否则,您应该能够将服务器配置为不处理该特定文件,或者它所在的路径。如何执行此操作取决于您正在运行的服务器。

答案 2 :(得分:1)

如果此类php文件位于同一服务器/网站上,则只需将其作为普通文件打开,例如$fileContents = file_get_contents($filename);

如果文件位于其他服务器上,则您的可能选项很少:

1)通过FTP访问它(如果您有登录详细信息和访问权限)

2)在该服务器上有特殊的URL重写规则,该规则将指示Web服务器以纯文本形式发送文件而不是执行它(例如somefile.php.txt

3)在该服务器上安装特殊脚本,并通过传递文件名作为参数,它将返回该文件的内容(例如http://example.com/showfile.php?file=somefile.php

答案 3 :(得分:1)

这是如何下载php文件而不是执行它。

相信我它有效! ..下载文件php有自己的风险:)

<?php
function downloadThatPhp($nameOfTheFile)
    {
        header("Pragma: public");
        header("Expires: 0"); // set expiration time
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Content-Type: application/text/x-vCard");
        header("Content-Disposition: attachment; filename=".basename($nameOfTheFile).";");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".filesize($nameOfTheFile));
        @readfile($nameOfTheFile);
        exit(0);
    }

    // and this how to use:
    // download that php file with your own risk :)
    $file = $_REQUEST['file_name'];
    $downloadThis = "http://domain-name.com/".$file;
    if (file_exists($file)) {
        downloadThatPhp($downloadThis);
    }
?>

希望这可以帮助你兄弟:)

答案 4 :(得分:0)

您可以在php.net/header上阅读很多相关信息,但要强制下载,您可以使用强制下载标头。 This comment is amazing,看看吧! : - )

答案 5 :(得分:0)

如果有人希望在其.htaccess文件中执行此操作:

Header set Content-Disposition attachment
AddType application/octet-stream .php

<FilesMatch "\.(?i:php)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>