Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP下载的文件不能通过HTTPS工作(通过HTTP工作正常)_Php_Https - Fatal编程技术网

使用PHP下载的文件不能通过HTTPS工作(通过HTTP工作正常)

使用PHP下载的文件不能通过HTTPS工作(通过HTTP工作正常),php,https,Php,Https,我被一个奇怪的问题困扰了大约一天(至少对我来说是这样) 我在服务器的文件系统中有许多(通常是PDF)文件,我希望通过PHP文件向用户提供这些文件,以简化业务逻辑(记录下载,使用户文件系统中的文件名更漂亮,…) PHP代码: // $ext = extension of the file; // $fullPath = full path of the file being downloaded on server's filesystem switch($ext) { case

我被一个奇怪的问题困扰了大约一天(至少对我来说是这样)

我在服务器的文件系统中有许多(通常是PDF)文件,我希望通过PHP文件向用户提供这些文件,以简化业务逻辑(记录下载,使用户文件系统中的文件名更漂亮,…)

PHP代码:

// $ext = extension of the file; 
// $fullPath = full path of the file being downloaded on server's filesystem    

switch($ext) { 
  case "pdf": $ctype="application/pdf"; break;
  case "zip": $ctype="application/zip"; break;
  case "doc": $ctype="application/msword"; break;
  case "xls": $ctype="application/vnd.ms-excel"; break;
  ...
  default: $ctype="application/octet-stream";
}

$fsize = filesize($fullPath);

header("Pragma: public");
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: " . $ctype);
header("Content-Disposition: attachment; filename=\"" . $targetName . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);
ob_clean();
flush();
readfile($fullPath);
重要提示:我使用CloudFlare(免费),所以对于HTTPS,我使用他们的SSL证书(这对其他任何东西都很好,很好)

它的行为如何?

  • 如果我使用HTTP调用脚本,一切正常
  • 使用HTTPS调用时,其行为异常:
    • [错误]Safari(MacOS):文件已下载到客户端的文件系统,但浏览器未完成下载
    • [错误]Chrome54(MacOS):看起来它甚至没有启动
    • [错误]Chrome 51(Win7 Enterprise+SP1):它看起来像是下载了文件,但最后显示“网络错误”,文件无法打开
    • [确定]MSIE11(Win7 Enterprise+SP1):工作正常
    • [OK]curl-in-Terminal(MacOS):它工作正常,文件可以下载并以正确的形式打开
到目前为止我所尝试的:

  • 不同的文件大小-相同的行为
  • 两个ISP(100Mbit光纤+30/8Mbit无线)-性能相同
  • 将Cloudflare设置为开发模式(因此我应该绕过Cloudflare,但仍在使用SSL——因此我认为这可能是问题的根本原因)——行为没有改变
  • 在脚本中添加了某些“断点”的日志记录-按预期,它甚至可以为HTTPS请求运行(HTTP和HTTPS请求之间没有区别)
  • 搜索web/StackOverflow,但所有答案都应该已经在上面的PHP脚本中(如“添加内容处置”、“删除所有空白”)或尝试超链接HTML元素的新“下载”属性(但它仍然是相当新的,不容易为“业务需要”提供解决方案)
自己试一试(大约1,5MB文件)

  • HTTP:
  • HTTPS:

https下载对我来说很好(PC、Firefox和Chrome)。那么,可能只是您的客户端与ssl证书相结合的本地问题?你的代码没有任何“错误”。谢谢你给我另一个“向量”来检查。但是在Windows7的PC上,它的行为又变得很可怕(更新了问题本身)->在Chrome 51中的Win7 Enterprise上-错误,在MSIE11中-工作正常如果您将文件\u get\u contents()与HTTPs一起使用,那么它将无法正常工作。这很奇怪,我认为代码中没有使用文件\u get\u contents()。要流式传输文件内容,我使用readfile()函数。主要是因为它应该对内存更友好:-)HTTPS-下载在Windows10Chrome上运行良好。