【问题标题】:How to use multiple http headers?如何使用多个 http 标头?
【发布时间】:2019-03-20 17:17:00
【问题描述】:

我有一个下载 zip 文件的 php 页面。通常在下载后,它会使用header('location:myfiles.php');自动将用户返回到上一页(myfiles.php)。

当我执行该页面时,它会将我带到myfiles.php,但不会出现下载弹出窗口,从而阻止我下载我的 zip 文件。当我删除header('location:myfiles.php'); 行时,我可以按预期下载我的 zip 文件。

以下是我的代码摘录。

    //Some codes
    if(file_exists($zip_name)){

       // push to download the zip
       header('Content-type: application/zip');
       header('Content-Disposition: attachment; filename="'.$zip_name.'"');
       readfile($zip_name);

       // remove zip file is exists in temp path
       unlink($zip_name);
    }        
    session_start();
    $_SESSION['correct']="Files downloaded sucessfully";
    header('location:myfiles.php');

您能帮我找到解决方法吗?谢谢。

【问题讨论】:

  • readfile 输出数据,内容发送后不能使用header。 session_start 也是如此,它应该在任何输出之前调用。
  • 根据浏览器请求,您可以发回页面或要求它加载不同的位置;不是两者
  • 我认为您在下载后无法使用标头重定向。下载过程是一个特定的过程,它必须是某个页面。此外,所有响应(带有标题)都在您的项目中一次出现。所以你不能用 readfile 做到这一点。如果您使用发送二进制文件并使用 ob_flush() 函数“可能”,则“可能”是可能的。
  • 感谢您的准确回复,我将从我的代码中删除session 部分。

标签: php http-headers


【解决方案1】:

想想那些标题在做什么

这2个和readfile

header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$zip_name.'"');
readfile($zip_name);

正在向浏览器上的当前页面发送文件。

这个,将和上面的代码一样运行

header('location:myfiles.php');

试图告诉浏览器转到另一个页面。如果确实这样做了,那么您发送到浏览器的文件就会消失

所以基本上作为一个流程一起完成,它们没有意义!

此外,在将任何实际数据发送到浏览器后,您也不能发送 header('location:...),当然,您在运行 readfile($zip_name); 时会这样做

【讨论】:

  • 既然您正在解释这一点,我似乎更清楚了。所以基本上下载完成后不可能自动重定向到另一个页面?或者有其他解决方案吗?
  • 请记住,用户必须能够对上传做出反应并获得保存/打开方式对话框等。
  • 我经常看到它使用 iframe 完成。截至今天,我不知道它是否与浏览器安全设置冲突(尽管可能不会)。
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 2021-02-12
  • 2016-11-09
  • 2021-02-24
  • 2021-07-16
  • 2021-06-29
  • 2016-03-22
相关资源
最近更新 更多