【问题标题】:How to force a file to download in PHP如何在 PHP 中强制文件下载
【发布时间】:2010-08-13 11:32:17
【问题描述】:

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

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

编辑

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

【问题讨论】:

  • <a href="path/to/your/file">download</a>?
  • @RaYell 他说 在 PHP 中。所以实际上是echo '<a href="path/to/your/file">download</a>';:P

标签: php html download


【解决方案1】:

如果你想强制下载,你可以使用类似下面的东西:

<?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.');
    }
?>

如果您只是使用普通链接链接到此脚本,则会下载该文件。

顺便说一句,上面的代码 sn-p 需要在页面的开头执行(在任何标题或 HTML 输出发生之前)。如果您决定基于此创建一个用于下载的函数,请注意任意文件 - 如果您接受来自 $_GET 或 $_POST 的输入,您需要确保防止目录遍历(realpath 很方便),仅允许从定义的区域内下载等。

【讨论】:

  • 正是我想要的,但是如何在单击应该执行该脚本时将其与“下载”之类的链接连接起来
  • +1 嘿,伙计,它工作了,但下载的文件发现已损坏,我无法打开图像..
  • @Om 然后查看下载文件的源以获取任何错误消息。
  • @OM - 请记住,如果您不包含 Cache-Control 标头,某些浏览器会很生气。 (尽管这可能不是您的错误的根源。)我会再次更新代码。
  • @OM 你需要: a) 稍微调整一下你的态度。 b) 提供磁盘上文件的有效路径。 :-)
【解决方案2】:

在 HTML5 中可以使用&lt;a&gt; 标签的download 属性:

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

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

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

阅读更多here

【讨论】:

    【解决方案3】:

    解决方案比你想象的更容易;)简单的使用:

    header('Content-Disposition: attachment');
    

    仅此而已。例如,Facebook 也是如此。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 而不是重复添加相同的答案,您可能会考虑将您发现的问题标记为相同或重复。
      • 它们不是重复的。它们都是不同的问题,但有类似的可能解决方案。每个问题的单独答案可能与人们更相关,因此将其标记为重复可能会破坏有用的信息。只是我给出的答案可能对某些搜索这些问题的人有用。当我自己试图找到答案时,我回答的所有这些问题都出现在谷歌搜索中。我花了很长时间才找到解决方案,我想对每个问题进行回答,以便任何搜索的人也都知道这个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2013-06-26
      相关资源
      最近更新 更多