【问题标题】:Force the source url to download automatically by adding the url headers通过添加 url 标头强制源 url 自动下载
【发布时间】:2020-06-03 15:42:57
【问题描述】:

我有一个在浏览器中显示 pdf 文档的源 URL。它应该自动下载。

示例网址:http://doc.local.com/storage/temporary/2020-02-19/c3e175b4706492be8c0d90e497c86ea7/test.pdf

正是我想实现 amazon s3 临时 url 的工作方式(他们在 url 中添加了所有标题)

response-content-disposition=attachment

请不要建议我使用以下代码,因为前端需要一个 URL

header("Content-Length: " . filesize($file));
header("Content-Type: application/octet-stream;");
readfile($file);

【问题讨论】:

  • 您当前的代码是什么?请添加您的控制器代码。
  • 如果您希望 .pdf 文件的直接 URL 在用户访问它时返回相关标头,这将是您必须在您的网络服务器中配置的内容,与 PHP 无关 -因为正如您已经明确指出的那样,PHP 的责任只是返回正确的 URL,而不是文件本身。下载操作在浏览器和网络服务器之间完成,无需执行任何 PHP 脚本。 (注意,即使那样,设置此标头也只是向用户的浏览器指示如何处理文件 - 它没有义务遵守。)
  • 这个过程涉及到几个类。因此,为您提供 url 是如何生成的。 $filePath = 'temporary/2020-02-19/aaaaa/test.pdf' return Storage::disk($disk)->url($filePath);
  • @AlbertRaj 您应该在处理文件下载时添加标题,而不是在生成 URL 时。向我们展示处理文件响应的代码。
  • 生成 URL 的方式无关紧要。 URL 不包含标题。 HTTP 响应包含标头。当用户实际访问文件的 URL 时,需要将 content-disposition 标头发送到服务器 - 即下载实际发生的那一刻(而不是当您向他们提供 URL 时......这是一个单独的响应)。由于您的示例 URL 以 .pdf 结尾,我假设这是到文件的直接链接,由网络服务器直接提供。那是对的吗?如果是这样,那么正如我所说,您无法通过在 PHP 中执行任何操作来更改它返回的标头。

标签: php laravel local-storage php-7


【解决方案1】:

我有一个小技巧来完成任务 -

假设你的 URL 是什么 -

https://somedomain.com/somepath/file.pdf

如下创建一个api -

https://somedomain.com/somepath/file.pdf?signature=signature&ttl=some-ttl
  • 签名验证请求的真实性与否
  • ttl 用于验证该签名的 URL 是否仍然有效

然后在验证 API 请求后,您可以返回下载响应如下 -

public function getDownload()
{
    //PDF file is stored under project/public/download/info.pdf
    $file= public_path(). "/download/info.pdf";

    $headers = array(
              'Content-Type: application/pdf',
            );

    return Response::download($file, 'filename.pdf', $headers);
}

参考-Download files in laravel using Response::download

【讨论】:

    【解决方案2】:

    一个简单的前端解决方案。

    如果前端有href并触发它,这段代码肯定会工作。

    我在 PHP 中测试过,这里是代码。

    $url = 'http://doc.local.com/storage/temporary/2020-02-19/c3e175b4706492be8c0d90e497c86ea7/test.pdf';
    echo '<a download href="'. $url .'" target="_blank">click</a>';
    

    万一前端是重定向url而不是trigger,必须找出解决办法。

    【讨论】:

      【解决方案3】:

      我相信这是您浏览器的功能,而不是实际代码。大多数现代浏览器都具有在浏览器窗口内自动打开 PDF 的功能。此设置特定于您的浏览器。

      谷歌浏览器:

      设置 -> 网站设置 -> PDF 文档

      【讨论】:

      • 是的...但是包含文件的响应中合适的内容处置标头通常被浏览器解释为忽略 PDF 插件并仅将文件下载到磁盘的指令。 OP 问题的重点是如何/在何处将该标头注入正确的 HTTP 响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2023-03-13
      相关资源
      最近更新 更多