Web 服务器提供的 PDF 文件具有错误的 MIME 类型

Web 服务器提供的 PDF 文件具有错误的 MIME 类型

升级到最新版本的 Joomla 后,我正在处理的网站的下载内容出现错误。

示例页面:http://www.pacificpolicy.org/index.php?option=com_content&view=article&id=259:mic-paper&catid=39:rokfeature

他们在第一次访问时会提供正确的内容配置,但是任何进一步的访问 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 的配置,而不是您的代码。

相关内容