有没有可能从一个PHP文件中发送一个完全不起作用的头文件
在我提供音乐示例下载的页面上,我有几个标签,其href指向一个PHP文件。GET变量中包含的各种数据允许下载适当的文件。通常情况下,PHP会以典型的下载头响应,后跟readfile()。(以下代码仅供参考)。这会产生一个干净的下载(或某些浏览器上的下载/播放对话框)。我所说的“干净”,是指下载完成时不会干扰访问者页面 但是,如果请求的文件不可用,我不知道该怎么办。我知道这不应该发生,但如果发生了,我希望下载链接什么也不做。不幸的是,由于它是一个引用PHP文件的有没有可能从一个PHP文件中发送一个完全不起作用的头文件,php,request-headers,Php,Request Headers,在我提供音乐示例下载的页面上,我有几个标签,其href指向一个PHP文件。GET变量中包含的各种数据允许下载适当的文件。通常情况下,PHP会以典型的下载头响应,后跟readfile()。(以下代码仅供参考)。这会产生一个干净的下载(或某些浏览器上的下载/播放对话框)。我所说的“干净”,是指下载完成时不会干扰访问者页面 但是,如果请求的文件不可用,我不知道该怎么办。我知道这不应该发生,但如果发生了,我希望下载链接什么也不做。不幸的是,由于它是一个引用PHP文件的标记,因此不执行任何操作都会导致浏览
标记,因此不执行任何操作都会导致浏览器清除页面,并在地址栏中显示PHP文件的URL。不是一个好的游客体验!所以,我想要一种避免干扰页面的方法,如果有错误的请求,我什么也不做。我将使用javascript提醒访问者出了什么问题,但我不能让错误的文件请求清除页面
我想我已经有了一个解决方案,发布了一个标题('Location:#');当脚本检测到无法下载文件时。但几秒钟后,浏览器清除了该页面,并显示一条消息,表明该页面“重定向了您太多次。”(事实上,我的脚本日志中有100多个条目,尽管我只单击了一次标记。)
到目前为止,我唯一有效的解决方案是将我的下载头指向一个“虚拟”文件(在请求“不可用”文件时不干扰访问者页面的意义上有效)。实际的“silent.mp3”或“nosong.mp3”文件。但是有没有一种方法可以调用对调用页不起任何作用的header()?简单地调用exit或exit()将不起作用(访问者页面被重定向为空白。)
这并不重要,但这是我通常为响应d/l请求而调用的代码
function downloadFile($path) {
$path_parts = pathinfo($path);
$ext = strtolower($path_parts["extension"]); // don't need this.
$fsize =fileExists($path);
if ($fsize == 0)
{
header('Location: #'); // this doesn't work!!! (too many redirectcts)
exit;
}
//$dlname = $path_parts['filename'] . "." . strtolower($path_parts["extension"]);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: filename=\"" . $path_parts["basename"]."\"");
header("Content-Type: application/x-file-to-save");
header("Content-Transfer-Encoding: binary");
if($fsize) header("Content-length: $fsize");
$bytesRead = readfile($path);
return $bytesRead;
}
如果您使用的HTTP/1.x带有标准锚标记,没有JavaScript或其他客户端拦截。HTTP/1.0 204 No Content状态头将导致用户代理在单击返回204状态头的链接时看起来好像什么都没有发生 HTTP/1.0 204无内容
服务器已完成请求,但没有新信息 发回如果客户端是用户代理,则不应更改其 导致生成请求的文档视图。这 响应主要用于允许输入脚本或其他内容 在不引起用户代理更改的情况下执行的操作 活动文档视图。响应中可能包含新的元信息 实体标题的形式,应应用于文档 当前在用户代理的活动视图中。
资料来源: 这也与HTTP/1.1协议兼容 我建议使用输出缓冲,以确保应用程序不会错误地发送其他内容。此外,不需要发送
内容长度
标题
function downloadFile($path) {
if (!is_file($path) || !($fsize = filesize($path))) {
header('HTTP/1.0 204 No Content');
exit;
}
$path_parts = pathinfo($path);
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Disposition: filename="' . $path_parts['basename'] . '"');
header('Content-Type: application/x-file-to-save');
header('Content-Transfer-Encoding: binary');
header('Content-length: ' . $fsize); //fsize already validated above.
return readfile($path);
}
在创建链接之前执行文件检查是最简单的方法。 如果我正确理解了您的请求,那么您就有了希望让客户端下载的文件,以及下载某些文件的PHP脚本的链接 实现的问题是,当文件为空时,PHP脚本仍然必须加载并更改客户端页面的内容(从加载脚本的操作开始),这是不正确的行为(正确的是根本没有操作) 由于您在主下载页面上使用标记,在丢失文件的情况下,不更改页面内容的唯一方法是提前计算标记的内容。通过一个简单的PHP函数,您可以检查文件列表及其目录的内容,然后为存在的文件生成链接,为不存在的文件生成空白链接
总的来说,我认为将检查文件是否存在的功能与将文件下载到客户端的功能分开是实现所需功能的唯一方法。为什么不将target=“\u blank”在a标记中,它将打开a新选项卡,文件将在该选项卡中下载,如果失败,它将不会干扰您的主页。@muasif80--如前所述,访问者页面上没有任何更改。。。没有新选项卡,没有页面更改。只是一个对话框,询问他们是否要保存或“播放”文件。我喜欢@费里。请求由标记中的“href=”指向的PHP脚本处理。标题显示完成所有工作。问题是如果我没有要发送的文件怎么办。我不知道你所说的“HTTP版本”是什么意思。我的代码中没有这样的头或引用。那么,您是否建议在我没有文件要发送的情况下,我发出一个头(“HTTP/1.1 202”)?我不懂语法,也不擅长标题。让我知道,我会试试的。谢谢。在这里很晚了,但我会试试,让你知道,如果你的答案有效,我肯定会把它标记为“接受”。这肯定比强迫下载“沉默”要干净得多“。虽然我认为唯一可能发生的方式是没有授权的人试图使用我的脚本进入音乐。在这种情况下,让他们下载一个音乐文件,其中包含我对他们的盗版企图说一些屈尊俯就的“话”,这可能会很有趣,也很狡猾通常,当我在“onclick”事件中执行类似操作时,我可以分别执行多个XMLHttpRequests(),以确保首先执行文件。事实上,在我的例子中,很多类似的身份验证也在进行,甚至在有问题的音乐显示按钮图像(在标签中)之前。此外