PHP获取远程文件的MIME类型

11

嘿,什么是检查远程文件 MIME 类型的最快方法... 我正在考虑从前几个字节中读取并进行更多的检查... 我花了几个小时思考如何正确地做这件事,但是我脑海中没有任何想法... 我必须检查远程文件是否为 mp3,但它必须是快速检查...


定义“远程文件”?它是如何被访问的?HTTP?SMB?NFS?FTP?IMAP? - Quentin
也许这能帮到你:get_headers() - rsz
如果我只知道文件的扩展名而不知道实际文件名,那么头部信息在这种情况下就无法使用了。对吧?那么通过HTTP有什么解决方案呢? - hfarazm
3个回答

16

PHP curl_getinfo()

<?php
    # the request
    $ch = curl_init('http://www.google.com');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);

    # get the content type
    echo curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    # output
    // text/html; charset=ISO-8859-1
?>

输出

HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Fri, 09 Apr 2010 20:35:12 GMT
Expires: Sun, 09 May 2010 20:35:12 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219

为了确保文件实际包含MP3数据或其他媒体格式,我使用getID3()


嗯,有趣的事情,我用内容 <?php blabla ?> 制作了文件 john.mp3,但脚本说它是“音频/mpeg”格式,这个能修复吗? - Марин-Мемо Митрев
不幸的是,php Mime-type 只使用文件扩展名而不是实际文件内容生成。您需要使用一些第三方应用程序来验证文件是否包含有效的 mp3 数据。 - Favourite Onwuemene
3
如果您不想加载整个文件,只需阅读有关信息,可以使用以下选项:curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, TRUE); curl_setopt($ch, CURLOPT_NOBODY, TRUE); 这些选项将帮助您仅获取相关信息,而无需下载完整的文件。 - viplezer

6

发送HEAD请求,查看服务器声称的Content-Type。

这个stackoverflow问题讨论了如何通过PHP访问HTTP头。


2
当只检查远程服务器的 Content-Type 时,您正在信任它:
  • 远程服务器可能是恶意的并故意提供错误的 Content-Type
  • Content-Type 是使用文件扩展名生成的,因此恶意用户可以使用授权的扩展名存储错误的文件类型以绕过您的安全性
更安全的方法是在临时文件夹中下载文件,然后使用 mime_content_type 在本地检查 MIME 类型,使用 magic.mime
这种技术仅使用 魔数,只读取文件的前几个字节(头部),而这些字节可以被绕过。
最安全的方法是使用库来验证给定的文件是否对应所需的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接