在移动浏览器上下载任意数据文件

时间:2019-03-16 13:33:37

标签: php apache .htaccess http

我具有以下类函数:

  public function download_tour($tour, $filename) {
    $file = tempnam(sys_get_temp_dir(), 'tourfile');
    $temp = fopen($file, 'w');
    fwrite($temp, $tour); fclose($temp);
    header('Expires: 0');
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header('Cache-Control: private', false);
    header('Pragma: no-cache');
    header('Content-Type: application/tour');
    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header('Content-Length: '.filesize($file));
    header('Content-Transfer-Encoding: binary');
    header('Connection: close');
    ob_clean(); flush();
    readfile($file); unlink($file);
    exit;
  }

当用户提交下载特殊数据文件的请求时,将调用此函数。该文件包含一个很长但很简单的字符串:一系列经过序列化,ssl加密,base64编码的表单数据。

在任何桌面浏览器上,该功能的行为均符合预期:浏览器下载具有正确文件名并包含正确数据的文件。

在iOS 12上,该功能的行为与Safari预期的一样:浏览器提示用户保存文件(通过“文件”应用),并且文件以正确的文件名保存到用户选择的云存储中,并包含正确的数据。

但是,在iOS 12 Chrome和Firefox上,该过程似乎与Safari相同(如上所述),但是文件内容不包含用户数据字符串。而是,文件包含实例化/调用了类/函数的页面的HTML

我有两个问题:

  1. 这些浏览器为什么用页面的HTML内容填充文件 首先? $file var包含正确的数据字符串 在执行时,我什至看不到该功能如何访问 发送到浏览器的HTML。标头调用会产生 意外的行为?
  2. 是否存在一种产生一致结果的解决方案?

0 个答案:

没有答案