【问题标题】:PHP get remote file mime-typePHP获取远程文件mime-type
【发布时间】:2012-09-29 22:01:21
【问题描述】:

嘿,什么是检查远程文件 mime 类型的最快方法...我正在考虑从第一个字节中读取一些,也许更多...我花了几个小时思考如何使事情正确,但没有在我看来...我必须检查远程文件是否是 mp3,但它必须是 fastcheck...

【问题讨论】:

  • 定义“远程文件”?它是如何被访问的? HTTP?中小企业? NFS? FTP? IMAP?
  • 也许这可以帮助你:get_headers()
  • 如果我只知道文件的扩展名而不是实际的文件名,那么在这种情况下标题将不起作用。对?那么通过 HTTP 会有什么解决方案?

标签: php mime-types


【解决方案1】:

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()

【讨论】:

  • 嗯,有趣的事情,我制作了内容为 的文件 john.mp3,脚本说它是“音频/mpeg”,可以修复吗?
  • 不幸的是,php Mime-type 仅使用文件扩展名而不是实际文件内容生成。您必须使用一些第三方应用程序来实际验证文件是否实际包含有效的 mp3 数据。
  • 如果您不想加载整个文件,只需阅读有关它的信息,您可以使用以下选项: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, TRUE); curl_setopt($ch, CURLOPT_NOBODY, TRUE);
【解决方案2】:

发出 HEAD 请求。查看服务器声称的 Content-Type 是什么。

This stackoverflow question 讨论通过 PHP 访问 HTTP 标头。

【讨论】:

    【解决方案3】:

    仅检查您信任的远程服务器的Content-Type 时:

    • 远程服务器可能是恶意的,并故意提供错误的 Content-Type
    • Content-Type 是使用文件扩展名生成的,因此恶意用户可以使用授权扩展名存储错误的文件类型以绕过您的安全

    更安全的方法是将文件下载到临时文件夹中,然后使用mime_content_type 在本地使用magic.mime 检查 MIME 类型。

    这种技术只使用幻数,只读取文件的第一个字节(头),可以绕过。

    最安全的方法是使用一个库来验证给定文件对于它应该是所需的类型是否有效。

    【讨论】:

      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 2020-04-07
      • 2014-10-18
      • 2011-01-19
      • 2013-07-29
      • 1970-01-01
      • 2016-08-22
      • 2013-09-18
      相关资源
      最近更新 更多