使用php提供可下载文件



通过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;
}

我有两个问题:

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

  2. 我们如何在页面上显示一些文本?正如我们定义的header一样,我们没有php脚本的html输出。

  1. 是的,用PHP读取文件并将其写入用户将使用更多的内存和CPU,当然这取决于文件的大小
  2. 首先显示一个页面,并在页面上设置一个按钮/链接,将用户带到实际的下载脚本

此外,我还建议使用内容长度标头。

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

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

2我可以向你推荐两种方法。

方法1:

您需要javascript支持来方便地执行这种需求。假设您需要在可以下载的页面上显示一些HTML。你可以用你想要的HTML创建一个页面,还可以放一个下载按钮。

<input type="button" name="cmdDownload" id="cmdDownload" value="Download" onclick="downloadFile('<?php echo $pathToTheFile; ?>');" />

您可以保留隐藏的iframe来处理下载。

<iframe id="downloadFrame" style="display:none"></iframe>

假设你的PHP下载页面是download.PHP。

然后你就可以有这样一个javascript函数了。

<script type="text/javascript">
function downloadFile(filepath) 
{
    var ifrme = document.getElementById("downloadFrame");
    ifrme.src = "download.php?filepath="+filepath;
}
</script>

方法2:

除了上述方法,您还可以使用META刷新。

<meta http-equiv="Refresh" content="3;URL=<?php echo $fullHTTPathToYourFile ?>" />

你也可以用它来显示HTML。

  1. 与直接提供文件相比,开销稍大,因为您现在使用的是PHP
  2. 不,你不能。如果你输出了一个application/msword头,那么你输出的任何东西都将被视为.doc文件的一部分,并导致其损坏。如果你想输出一些文本,你必须分两部分进行下载——输出一个带有文本的标准HTML页面,并包括一个定时<meta>(或javascript)重定向,将用户转发到实际的下载url

如果输出缓冲是活动的,那么使用PHP服务文件将消耗大量内存,并且性能将比使用apache服务的常规文件差得多。

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

  • 发送标头后,使用ob_end_flush()结束输出缓冲,因此在开始输出之前,文件内容不会缓存在内存中
  • readfile()可能比循环更有效地将文件从磁盘流式传输到网络

已经说过了,但再强调也不为过:do包含Content-Length标头,因为这将允许下载者测量进度。

相关内容

  • 没有找到相关文章

最新更新