Javascript 如何在设置标头后将字符串返回给客户端

Javascript 如何在设置标头后将字符串返回给客户端,javascript,php,Javascript,Php,我在客户端有一个下载按钮。 单击按钮后,将使用PHP在服务器上设置一些标题以启动下载 //code snippet: $filename = basename($datei); $size = filesize($datei); $this->response->setHeader('Content-Type', "application/force-download", TRUE); $this->response->setHeader('Content-Dispos

我在客户端有一个下载按钮。 单击按钮后,将使用PHP在服务器上设置一些标题以启动下载

//code snippet:
$filename = basename($datei);

$size = filesize($datei);
$this->response->setHeader('Content-Type', "application/force-download", TRUE);
$this->response->setHeader('Content-Disposition', 'attachment; filename='.$filename , TRUE);
$this->response->setHeader('Content-Length', $size, TRUE);

return "TEST";   //<--code will never go this far, it is ignored
//代码段:
$filename=basename($datei);
$size=文件大小($datei);
$this->response->setHeader('Content-Type','application/forcedownload',TRUE);
$this->response->setHeader('Content-Disposition','attachment;filename='。$filename,TRUE);
$this->response->setHeader('Content-Length',$size,TRUE);

返回“测试”// 我使用的是MVC框架,在我的控制器中,我有一种方法可以做到这一点,无需从下载开始的位置重新加载父页面:

// Define headers
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
// Read the file
readfile($filePath);
exit;

要结束当前脚本,您可以使用
return
,但是当在顶级脚本中使用时(如您所用),它将结束执行,但不会传回任何返回值或输出任何内容作为HTTP响应的一部分。为此,您需要退出(但请参见下文)

return
只能将值传回调用脚本:

  • 在include/require中使用时,它将结束include/require并将值传递回调用脚本
  • 在函数中使用时,它将结束该函数并将值传递回调用脚本

要结束当前脚本并输出一个值作为HTTP响应的一部分,可以使用
exit
()或
die
(与exit相同)。但是
exit
可以在传递参数时更改其行为:

  • 如果是字符串,它将作为HTTP响应的一部分发送
  • 如果是整数,它将使用它作为退出代码(用于命令行使用)

要输出任何要作为HTTP响应的一部分“返回”的内容,请使用
echo
。(). 这将输出可转换为字符串的任何内容(即输出整数或字符串),并且在整数或字符串退出时不会改变行为


因此,最安全的选择是:

  • 始终使用
    echo
    将内容作为HTTP响应的一部分发送回来
  • 始终使用
    exit
    结束执行
  • 在您知道将“包括”的函数或文件中使用return(并可以选择传回一个返回值)
理想情况下(为了避免代码中潜在的歧义),对于HTTP响应,除非您正在为命令行接口编程,否则不要添加要退出的返回值。i、 e.对于HTTP,使用

// Outputs something and exists
echo 'TEST';
exit;


如果要输出文件(而不是内存中的变量),请查看
readfile()
(),它将向HTTP响应输出文件流。(后跟退出;


*额外提示:
exit
echo
return
本身不是函数,而是语言结构。不应在括号中指定
exit
return
的返回值。它可以工作,但PHP手册建议不要这样做
echo
可以使用参数,如果要传递多个输出值,则必须使用参数

错:

  • 退出(“测试”)
  • 返回(“测试”)
正确:

  • 退出“测试”
  • 返回“测试”
  • 回声“测试”
  • echo(‘测试’、‘更多’)

不能。不要浪费时间去寻找黑客,而是相应地设计你的下载页面

当您告诉浏览器(使用标题)您将提供一个文件以供下载时,如下图所示

$this->response->setHeader('Content-Type', "application/force-download", TRUE);
然后所有最近的浏览器都会按照这个建议下载文件,之后他们不在乎PHP是否能够在最后回显某些内容,他们不需要它

您的PHP代码没有被忽略,处理得很好。PHP不会阻止您在为浏览器提供一些标题后生成任何代码。只是,一旦你告诉客户你将返回一个文件下载,它就不会打扰你想要输出什么其他文本。事实上,这将被视为下载文件的一部分。您在文件中看不到它,因为它是一个
返回
,在该内容中不有用,请尝试
回显

当您提供内容类型标头时,如果您希望浏览器成功理解服务器的响应,则希望您发送该类型的内容

看看所有主要的下载站点,几乎所有的站点都有自己的下载设置,这样当你点击一个下载链接时,你会被重定向到另一个页面,上面写着“你的下载很快就会开始…”,同时他们会向他们的下载页面发起另一个请求,而这个请求就是这样做的;提供要下载的文件

//code snippet:
$filename = basename($datei);

$size = filesize($datei);
$this->response->setHeader('Content-Type', "application/force-download", TRUE);
$this->response->setHeader('Content-Disposition', 'attachment; filename='.$filename , TRUE);
$this->response->setHeader('Content-Length', $size, TRUE);

return "TEST";   //<--code will never go this far, it is ignored

因此,在一个请求中,您无法成功地将两者结合在一起,同时还具有相当多的浏览器兼容性。

对我来说,下载也可以在不重新加载的情况下工作。但由于其他原因,我需要在下载开始后直接重新加载。我真的不认为OP想知道这一点。OP想知道如何在一个http响应中提供下载文件和一些文本输出。我已经直接回答了这个问题,即为什么
返回“TEST”不返回任何内容。然而,OP已经大大改变了这个问题,从第一稿开始——如果这不是试图解决的问题,那么应该关闭问题,打开一个新的问题。我明白了,这是有道理的。我没有看到修改的历史是的,如果他不提这个问题,有一个非常简单的答案(以你的答案为基础——同样正确,但没有提供完整的解决方案)。但是,由于这一回答解决了他目前的问题,我将等待OP提出另一个问题,以及他想解决的问题(即,在他的问题的修订版1-3中)。当然,我要求解决问题,因为现在是这样。最后一次编辑是在2天前,当时的悬赏还没有推迟。编辑没有完成
$this->response->setHeader('Content-Type', "application/force-download", TRUE);