升级到最新版本的 Joomla 后,我正在处理的网站的下载内容出现错误。
他们在第一次访问时会提供正确的内容配置,但是任何进一步的访问 PDF 文件都会被加载为文本/html(即在屏幕上显示文件的内容)。
如何强制浏览器在每次访问时正确加载 PDF?我对 PHP 和 http 标头的了解非常基础,因此我需要一些帮助来诊断这个问题。
主机是LAMP服务器,Joomla是1.5.22,文档管理插件是Rubberdoc。
第二次访问时的响应标头内容为:
Date: Thu, 16 Dec 2010 04:29:03 GMT
Server: Apache/XXx
X-Powered-By: PHP/xxx
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Etag: db71388c6fc952682ae2fd733d4b09c5
Content-Encoding: gzip
X-Content-Encoded-By: Joomla! 1.5
Expires: Mon, 1 Jan 2001 00:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Host
Last-Modified: Thu, 16 Dec 2010 04:29:03 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
下载文档是从 PHP 文件调用的,其内容如下:
<?php
// Check to ensure this file is included in Joomla!
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
/**
* HTML View class for the RubberDoc component
*
* @static
* @package Joomla
* @subpackage RubberDoc
* @since 1.0
*/
class RubberDocViewDoc extends JView
{
public function display($tpl = null)
{
global $mainframe, $option;
$id = JRequest::getInt('id');
if(!$id)
{
JError::raiseError(404, 'Page Not Found');
return;
}
$model =& $this->getModel('doc');
$model->hit();
$data =& $model->getData();
$fileName =& $data->get('file');
$dirname = $mainframe->getParams('com_rubberdoc')->get('rubberdoc_dir', 'rubberdoc');
$filePath = JPath::clean( JPATH_SITE.DS.$dirname.DS.$fileName );
if( !JFile::exists( $filePath ) )
{
JError::raiseError(404, 'Page Not Found');
return;
}
$fileName = $data->get('file');
$extension = array_pop( explode('.', $fileName) );
$fileName = $data->get('alias').'.'.$extension;
$fileContent = JFile::read( $filePath );
$fileSize = strlen($fileContent);
require(JPATH_COMPONENT.DS.'helpers'.DS.'mime.mapping.php');
$mime = $mime_extension_map[$extension]; //application/octet-stream
// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
$doc =& JFactory::getDocument();
$doc->setMimeEncoding( $mime );
$doc->setModifiedDate( $data->get('modified') );
$doc->render();
header('Content-Disposition: attachment; filename="'.$fileName.'" ');
header('Content-Length: '. $fileSize);
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
if( ! ini_get('safe_mode') ) { // set_time_limit doesn't work in safe mode
@set_time_limit(0);
}
echo $fileContent;
}
}
谢谢,尼克 瓦努阿图维拉港
答案1
很难确定,但我怀疑在第一次访问时,它们是由 java 代码提供的,该代码设置了正确的 mime 类型。之后,可能有一些缓存没有设置正确的 mime 类型。看看磁盘上是否有任何 PDF 文件。如果有,您需要查看 apache 的配置,而不是您的代码。