PHP在Android浏览器上强制下载失败-通过Joomla框架

PHP在Android浏览器上强制下载失败-通过Joomla框架,php,android,joomla,download,Php,Android,Joomla,Download,我有一个下载脚本,如下所示,在Joomla框架中运行: if(headers_sent()) die('Headers Sent'); if (function_exists('finfo_file')) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $type = finfo_file($finfo, $dir.$filename); finfo_close($finfo); } else { $type = mime_

我有一个下载脚本,如下所示,在Joomla框架中运行:

if(headers_sent()) die('Headers Sent');

if (function_exists('finfo_file')) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $type = finfo_file($finfo, $dir.$filename);
    finfo_close($finfo);
} else {
    $type = mime_content_type($dir.$filename);
}
// required for IE
if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off');  }

jimport( 'joomla.filesystem.file' );
$ext = strtoupper(JFile::getExt($filename));
$no_ext = JFile::stripExt($filename);

header('Content-Transfer-Encoding: Binary'); //need this to recognise in firefox that it is a PDF and not html doc
header('Content-length: '.filesize($dir.$filename));
header('Content-Type: application/octet-stream'); //works on browsers, but still fails on android (rather than unsuccessful) with 'redirect error'
header('Content-Disposition: attachment; filename="' . $no_ext.'.'.$ext.'"'); 
readfile($dir.$filename);
exit; //need to exit otherwise ff thinks this is a html document. 
该脚本在所有桌面浏览器和苹果产品上都能正常工作,但在Android上尝试时几乎立即失败。给出的错误是带有“.bin”文件的“重定向错误”,但使用稍微不同的代码我得到了“无效URL”

但是,如果我将它从我的资产存储库模型复制到一个.php页面(导入Joomla框架),并通过Android访问它,那么它就可以完美地工作。通过模型下载时的URL为www.domain.com/resources/download/40-alias-of-file,静态PHP页面为:www.domain.com/download.PHP?id=40

Android上显示的文件名在通过model下载时显示为文件的40别名,但PHP页面上给出的实际文件名由Android浏览器接收。这是完全相同的代码,唯一的区别是URL和通过控制器/模型的路由。我尝试将.pdf添加到URL,但没有成功:www.domain.com/resources/download/40-alias-of-file.pdf-它给文件添加了一个pdf图标,但仍然失败

有人有什么想法吗


非常感谢

此文件以前/最近是否被修改过?您是否尝试过使用fpassthru()


内容长度
应按此处大写,但我不知道这是否是您问题的解决方案。感谢您指出这一点!然而,不幸的是,它无法解决问题……您是否尝试过切换
内容传输编码
标题?如果将头文件/读取文件部分作为独立脚本运行,是否排除了Joomla干扰?注释掉了内容传输编码,但仍然没有区别。这个脚本在一个独立的php文件中工作(但也导入了Joomla框架),因此一定与代码在模型中的事实有关,否则Android可能会被URL弄糊涂
if(headers_sent()) die('Headers Sent');

if (function_exists('finfo_file')) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $type = finfo_file($finfo, $dir.$filename);
    finfo_close($finfo);
} else {
    $type = mime_content_type($dir.$filename);
}
// required for IE
if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off');  }

jimport( 'joomla.filesystem.file' );
$ext = strtoupper(JFile::getExt($filename));
$no_ext = JFile::stripExt($filename);
$fd = fopen($dir.$filename, "rb");

header('Pragma:  '); //I am surprised it worked with IE without this
header('Content-Transfer-Encoding: Binary'); //Try also without this header
header('Content-Length: '.filesize($dir.$filename));
header('Content-Type: '.$type); 
header('Content-Disposition: attachment; filename="' . $no_ext.'.'.$ext.'"'); 

if ($fd) {     
   fpassthru($fd);         
   fclose($fd);              
   exit();         
}