【问题标题】:PHP header call two times when download from mobile从手机下载时PHP标头调用两次
【发布时间】:2014-12-23 07:38:51
【问题描述】:

我有一个如下的 download.php 文件。当我从 PC 互联网浏览器单击下载.php 页面时,它工作正常并发送单个请求。但是,当我从移动设备单击同一页面时,它会发送两个请求。

$filename ="test.mp3";
LogWriter($filename);
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

当我从 PC 上点击时的日志文件:

时间:2014-12-23 13:20:24||消息:test.mp3

当我从移动设备单击同一文件时的日志文件:

Time: 2014-12-23 13:31:24|| Message: test.mp3
Time: 2014-12-23 13:31:28|| Message: test.mp3

有什么想法吗?请帮忙。

【问题讨论】:

  • 我们需要查看发送请求的代码,而不是响应的脚本。
  • 这是完整的代码,只是有一个额外的 LogWrite 函数如下:function LogWriter($log_message) { $time_value = (date_default_timezone_set("Asia/Dhaka") * 120); $current_time = date("H:i:s",time() + $time_value); $hour=substr($current_time,0,2); $text_file_name=date('d-m-Y')." ".$hour.".txt"; $current_date_time=date('Y-m-d')." ".$current_time; $fp = fopen($text_file_name,'a'); $writing_info="时间:".$current_date_time."|| 消息:".$log_message."\r\n"; fwrite($fp, $writing_info); fclose($fp); }

标签: php header http-headers


【解决方案1】:

创建一个告诉你几秒钟前请求过的会话

session_start();
$filename ="test.mp3";

if(!empty($_SESSION['download_'.$filename]) &&
     (time() - $_SESSION['download_'.$filename) < 10)) exit;
// Check, then exit if you have requested before in 10 seconds

$_SESSION['download_'.$filename] = time();
LogWriter($filename);
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

注意:但你不能在服务器端弄错它。因为这是客户端问题

【讨论】:

  • 感谢您的建议。但是该代码将用于商业站点,并且每个第二个文件下载请求都会出现。所以,实现这种类型的代码会很困难。
  • 为什么? $_SESSION 对每个用户的显示都不同。如果你使用$_SESSION,用户A和用户B会有不同的结果
  • 您的解决方案是正确的。没有其他选择可以阻止这种双重请求。无论如何,我们可以使用 session_id() 值而不是“download_”会话名称。因为不同的用户可以同时请求相同的文件。请查看我对您的答案的编辑。如果我错了,请纠正我。
  • 是的,我明白了。但是每个用户都有不同的 PHPSESSID。所以不用担心。导致$_SESSION 使用浏览器cookie。只需使用我的代码,您就会满意
猜你喜欢
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多