Php mime\u内容\u类型问题,带有一些扩展名

Php mime\u内容\u类型问题,带有一些扩展名,php,mime-types,file-extension,Php,Mime Types,File Extension,我尝试mime\u content\u type()/finfo\u open()。对于.doc可以,但是对于.docx返回'application/zip',对于.xls则不返回任何内容 有什么问题?这是我的浏览器的问题吗?这个问题基本上是一样的: 而且似乎没有解决办法。它不是你的浏览器,它是一个试图猜测的mime“魔法”文件,并且没有办法区分docx和zipfile之间的区别,因为docx实际上是一个zipfile 如果你和我一样,可能出于任何原因使用php>=5.3.0服务器,也可能不使用

我尝试mime\u content\u type()/finfo\u open()。对于.doc可以,但是对于.docx返回'application/zip',对于.xls则不返回任何内容


有什么问题?这是我的浏览器的问题吗?

这个问题基本上是一样的:


而且似乎没有解决办法。它不是你的浏览器,它是一个试图猜测的mime“魔法”文件,并且没有办法区分docx和zipfile之间的区别,因为docx实际上是一个zipfile

如果你和我一样,可能出于任何原因使用php>=5.3.0服务器,也可能不使用php>=5.3.0服务器,并且希望为所有服务器使用一组代码,或者坚持在没有Fileinfo的服务器上使用mime_content_type函数,那么你可以使用像我这样的半自动解决方案,这是一个替换函数,在php>=5.3.0上它使用Fileinfo,在较低版本上,如果文件名以一个特定字符串结尾,该字符串是您要重写的内容所特有的,它将返回您的硬编码值,并为所有其他类型调用mime\u content\u type()。但是,如果文件的类型被mime_content_type()错误地检测到,并且文件名没有以扩展名结尾,那么这当然不起作用,但这种情况应该非常罕见

这样的解决方案可能看起来像这样:

function _mime_content_type($filename)
{

        //mime_content_type replacement that uses Fileinfo native to php>=5.3.0
    if( phpversion() >= '5.3.0' )
    {

        $result = new finfo();

        if (is_resource($result) === true)
        {
            return $result->file($filename, FILEINFO_MIME_TYPE);
        }

    }

    else
    {

        if( substr( $filename, -5, 5 ) == '.docx' )
            return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
        else if( substr( $filename, -5, 5 ) == '.xlsx' )
            return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
        else if( substr( $filename, -5, 5 ) == '.pptx' )
            return 'application/vnd.openxmlformats-officedocument.spreadsheetml.presentation';
        //amend this with manual overrides to your heart's desire


        return mime_content_type( $filename );

    }

}
然后,您只需将所有对mime\u content\u type的调用替换为对mime\u content\u type的调用