如何在PHP中强制下载文件

6
我有一组图片,希望每张图片旁边都有一个“下载”链接,以便用户可以下载图片。请问有人能指导我如何在php中提供任何文件的下载链接吗?
【编辑】 我希望点击下载链接后会显示一个下载面板,而不是在浏览器中显示图片。

4
<a href="path/to/your/file">download</a> - RaYell
1
@RaYell 他说用PHP写的。所以实际上应该是echo '<a href="path/to/your/file">download</a>'; :P - Pekka
4个回答

35
如果您想强制下载,可以使用以下方式:
<?php
    // Fetch the file info.
    $filePath = '/path/to/file/on/disk.jpg';

    if(file_exists($filePath)) {
        $fileName = basename($filePath);
        $fileSize = filesize($filePath);

        // Output headers.
        header("Cache-Control: private");
        header("Content-Type: application/stream");
        header("Content-Length: ".$fileSize);
        header("Content-Disposition: attachment; filename=".$fileName);

        // Output file.
        readfile ($filePath);                   
        exit();
    }
    else {
        die('The provided file path is not valid.');
    }
?>

如果您只是使用普通链接来链接到此脚本,文件将被下载。
顺便说一下,上面的代码片段需要在页面开始执行(在任何标头或HTML输出之前)。同时,如果您决定创建一个基于此的函数来下载任意文件,请注意 - 如果您正在从$_GET或$_POST接受输入,您需要确保防止目录遍历(realpath很方便),仅允许从定义区域内下载等。

1
我确实想要这个,但是我该如何将它与类似“下载”的链接连接起来,点击该链接时应执行此脚本。 - OM The Eternity
1
嘿,老兄,它起作用了,但下载的文件发现损坏,我无法打开图像。 - OM The Eternity
1
@OM 你需要做到以下两点:a) 调整一下你的态度。b) 提供一个有效的磁盘文件路径。 :-) - John Parker
我的问题是这段代码将文件内容输出到浏览器,而不是强制下载。 在我的情况下可能是什么问题? - Bernhard Pointner
1
@BernhardPointner 你确定在调用 header 函数之前没有输出 任何 内容吗?(如果有的话,header 命令将被忽略,因此你可能会遇到你所描述的问题。)请检查你的 PHP 错误日志。 - John Parker
显示剩余12条评论


2
解决方案比你想象的要简单 ;) 只需简单使用:
header('Content-Disposition: attachment');

就是这样。例如,Facebook也是如此。


0

您可以在 .htaccess 文件中指定不同的文件扩展名来实现此功能。有时这比硬编码到应用程序中更容易。

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

顺便提一下,在它正常工作之前,您可能需要清除浏览器缓存。

将相同的答案重复添加,改为考虑将您发现的问题标记为重复。 - bummi
1
它们不是重复的。它们都是不同的问题,但有着相似的可能解决方案。每个问题的单独答案可能更相关,因此将其标记为重复可能会破坏有用的信息。只是我给出的答案可能对一些搜索这些问题的人有用。我回答的所有这些问题都在谷歌搜索中出现,当我自己尝试找到答案时。我花了很长时间才找到解决方案,我想在每个问题上回答,以便任何搜索的人也知道这个解决方案。 - Chris Harrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接