【发布时间】:2013-02-11 11:55:01
【问题描述】:
我有一个下载脚本如下,在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.
此脚本在所有桌面浏览器和 Apple 产品上都可以正常工作,但在 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 上显示的文件名在通过模型下载时显示为 40-alias-of-file,但 PHP 页面上给出的实际文件名由 Android 浏览器接收。它是完全相同的代码,唯一的区别是 URL 和通过控制器/模型的路由。我尝试将 .pdf 附加到 URL 但没有运气:www.domain.com/resources/download/40-alias-of-file.pdf - 它为文件提供了一个 PDF 图标但仍然不成功。
有人有什么想法吗?
非常感谢!
【问题讨论】:
-
Content-Length应该在这里大写,但我不知道这是否是您问题的解决方案。 -
感谢您指出这一点!然而,不幸的是它并没有解决问题......
-
您是否尝试过切换
Content-Transfer-Encoding标头?如果您将标头/读取文件部分作为独立脚本运行,是否排除了 Joomla 的干扰? -
注释掉了Content-Transfer-Encoding,但还是没有区别。这个确切的脚本在独立的 php 文件中工作(但也导入 Joomla 框架),所以必须与代码在模型中的事实有关,否则 Android 可能会被 URL 混淆
标签: php android joomla download