如何在PHP中强制下载文件

时间:2010-08-13 11:32:17

标签: php html download

我有图像列表,我想要一个“下载”链接以及每个图像,以便用户可以下载图像。

那么有人可以指导我如何为php中的任何文件提供下载链接吗?

  

修改

我希望在点击下载链接时显示下载面板我不想导航到要在浏览器上显示的图像

4 个答案:

答案 0 :(得分:30)

如果要强制下载,可以使用以下内容:

<?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输出之前)。如果你决定创建一个基于此的函数来下载任意文件,也要小心 - 你需要确保防止目录遍历(realpath很方便),只允许从定义区域内下载等,如果你接受来自$ _GET或$ _POST的输入。

答案 1 :(得分:2)

在HTML5 download中可以使用<a>标记的属性:

echo '<a href="path/to/file" download>Download</a>';
  

仅当设置了href属性时才使用此属性。

     

对允许的值没有限制,浏览器会   自动检测正确的文件扩展名并将其添加到文件中   (.img,.pdf,.txt,.html等)。

了解更多here

答案 2 :(得分:1)

您认为解决方案更容易;)简单使用:

header('Content-Disposition: attachment');

就是这样。例如Facebook就是这样做的。

答案 3 :(得分:0)

您可以在.htaccess中执行此操作,并指定不同的文件扩展名。除了硬编码到应用程序之外,有时这样做更容易。

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

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