【问题标题】:Nette Redirect and Send file in the same formNette 以相同的形式重定向和发送文件
【发布时间】:2020-08-07 18:37:20
【问题描述】:

我在发送文件并同时重定向到新页面时遇到问题,现在它只能通过两种方式工作:

1。通过 sendResponse 发送文件
2。重定向到新页面

表单成功后我的代码:

  $this->sendResponse(new FileResponse($file));
  $this->redirect('this', ['Id' => NULL, 'addAge' => NULL]);

我想知道如何发送文件并重定向到新页面,我尝试创建一个指向下载演示器的链接,但它仍然不起作用。

【问题讨论】:

    标签: php nette


    【解决方案1】:

    您可以使用header() 发送 HTTP Location 标头

    header('Location'.'new url');
    

    【讨论】:

      【解决方案2】:

      使用这些方法,您无法在发送响应后重定向,因为发送响应将终止 HTTP 连接:

      https://github.com/nette/application/blob/7177fcdb5edbf9fc90c78dc9763d6bd2cc1cc452/src/Application/UI/Presenter.php#L613

      并且您无法在重定向后发送响应,因为这也会终止连接:

      https://github.com/nette/application/blob/7177fcdb5edbf9fc90c78dc9763d6bd2cc1cc452/src/Application/UI/Component.php#L286 https://github.com/nette/application/blob/7177fcdb5edbf9fc90c78dc9763d6bd2cc1cc452/src/Application/UI/Presenter.php#L660

      更糟糕的是,下载通常(和also in this case)使用Content-Disposition HTTP header 完成,它告诉浏览器以提供的文件名下载HTTP 响应的正文。

      另一方面,重定向是使用Location header 完成的(heretoo),它告诉浏览器它应该在不同的位置试试运气,这样它甚至不会检查正文。

      这两个用例本质上是冲突的。

      我建议在目标页面上添加<meta http-equiv="refresh"> 以重定向到发送文件响应的路由。这应该使用户留在您想要重定向到的目标页面上,同时提示他们下载附件。许多下载网站都是这样做的。

      【讨论】:

        猜你喜欢
        • 2012-08-16
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多