使用php提供可下载文件

使用php提供可下载文件,php,file,header,download,attachment,Php,File,Header,Download,Attachment,PHP通常会将位于公用文件夹之外的可下载文件发送到服务器: $fp = fopen($file,"r") ; header("Content-Type: application/msword"); header('Content-Disposition: attachment; filename="'.$filename.'"'); while (! feof($fp)) { $buff = fread($fp,4096); echo $buff; } 我有两个问题: 与we

PHP通常会将位于公用文件夹之外的可下载文件发送到服务器:

$fp = fopen($file,"r") ;
header("Content-Type: application/msword");
header('Content-Disposition: attachment; filename="'.$filename.'"');

while (! feof($fp)) {
    $buff = fread($fp,4096);
    echo $buff;
}
我有两个问题:

  • 与web服务器提供的静态文件(直接文件URL)进行比较;这种方法是否需要更多的资源(内存和cpu),因为PHP需要读取文件并交付

  • 如何在页面上显示一些文本?正如我们定义的
    标题
    ,我们没有php脚本的html输出

  • 与直接提供文件相比,开销稍大一些,因为您现在使用的是PHP
  • 不,你不能。如果您输出(比如)application/msword头,那么您输出的任何内容都将被视为.doc文件的一部分,并导致其损坏。如果你想输出一些文本,你必须分两部分进行下载——输出一个带有文本的标准HTML页面,并包括一个定时的
    (或javascript)重定向,以将用户转发到实际的下载url
  • 是的,使用PHP读取文件并将其写入用户将使用更多的内存和CPU,当然这取决于文件的大小
  • 首先显示一个页面,页面上有一个按钮/链接,将用户带到实际的下载脚本
  • 我还建议使用内容长度标题

    header('Content-Length: '. filesize($path));
    

    1由于必须使用此脚本处理文件,因此需要更多 资源不仅仅是普通的下载链接。然而,这取决于您的需要。如果您认为这些文件需要更高的安全性。假设只有经过身份验证的用户才能下载该文件,并且只有该文件属于他。然后你需要验证这些。在这种情况下,您需要输入问题中的代码。如果您的文件对公众开放,则您可以显示指向该文件的直接链接,该文件可能暂时位于公共位置

    2我可以向您推荐两种执行此操作的方法

    方法1:

    您需要javascript支持以方便的方式执行此类需求。假设您需要在可以下载的页面上显示一些HTML。你可以用你想要的HTML创建一个页面,你可以点击下载按钮


    如果输出缓冲处于活动状态,则使用PHP提供文件将消耗大量内存,并且性能将比apache提供的常规文件差得多

    因此,要在已经给出的答案中添加一些内容:

    • 发送完头后,使用
      ob\u end\u flush()
      结束输出缓冲,这样在开始输出之前文件内容不会缓存在内存中
    • readfile()
      可能比循环更有效地将文件从磁盘传输到web

    已经说过了,但强调得不够:一定要包括
    内容长度
    标题,因为它将允许下载程序测量进度。

    非常感谢提供有关
    标题的信息。它救了我一天
    
    <iframe id="downloadFrame" style="display:none"></iframe>
    
    <script type="text/javascript">
    function downloadFile(filepath) 
    {
        var ifrme = document.getElementById("downloadFrame");
        ifrme.src = "download.php?filepath="+filepath;
    }
    </script>
    
    <meta http-equiv="Refresh" content="3;URL=<?php echo $fullHTTPathToYourFile ?>" />