【问题标题】:Why am I getting mime-type of .csv file as "application/octet-stream"?为什么我将 .csv 文件的 mime 类型作为“application/octet-stream”?
【发布时间】:2017-11-01 10:58:57
【问题描述】:

我正在开发一个必须将 excel 文件导入 MySQL 的 PHP 应用程序。所以我需要将 excel 文件转换为 .csv 格式。但是当我想使用 $_FILE['something']['type'] 获取它的类型时,我会得到 application/octet-stream 作为它的 mime 类型;
我认为这里有问题。因为我将下面的列表收集为 .csv 文件 mime 类型:

text/comma-separated-values,  
text/csv,  
application/csv, 
application/excel, 
application/vnd.ms-excel, 
application/vnd.msexcel

怎么了?

【问题讨论】:

  • 此外,有时当您使用 MS excel 打开文件并从应用程序访问文件时,您会得到“application/octet-stream”作为 mime 类型。前段时间,我在一个 Java 应用程序中遇到过这种情况。
  • 请注意,如果您的文件大小通过了 php.ini 中的 upload_max_filesize 设置,您将得到 application/octet-stream 而不是预期的 mime

标签: php csv http-headers mime-types file-format


【解决方案1】:

在这种情况下,官方的 HTTP 规范总是很有帮助的。来自RFC 2616 7.2.1(我的重点补充):

任何包含实体主体的 HTTP/1.1 消息都应该包含定义该主体的媒体类型的 Content-Type 标头字段。当且仅当媒体类型不是由 Content-Type 字段给出时,接收者可以尝试通过检查其内容和/或用于识别资源的 URI 的名称扩展来猜测媒体类型。 如果媒体类型仍然未知,接收方应将其视为类型“application/octet-stream”

问题的原因是接受文件上传的服务器本身不知道上传的文件类型。为什么?因为它依赖于发送文件的 HTTP 消息来指定 Content-Type 标头来确定确切的 mime 类型。浏览器可能没有发送Content-Type 标头,并且服务器根据上面的官方HTTP 规范摘录假定application/octet-stream。上传文件的客户端也有可能选择不确定它上传的文件的 MIME 类型,而是自己发送了Content-Type: application/octet-stream 标头。

现在,当我们结合PHP manual entry regarding POST file uploadsdocs 考虑这一点时,我们会看到以下内容:

$_FILES['userfile']['type']

文件的 mime 类型,如果浏览器提供了此信息。一个例子是“image/gif”。然而,这种 mime 类型并没有在 PHP 端进行检查,因此不要认为它的价值是理所当然的。

所以可以看到,即使指定了$_FILES['userfile']['type'],也只对应客户端发送的Content-Type header。这些信息很容易被伪造,不应依赖。如果您需要确定上传的文件属于特定类型,则必须自己验证。

【讨论】:

  • 我们理解这一点,但如果遇到这个问题,我们该怎么办?当用户上传 csv 文件时,可以做些什么来提供有效的 mime 类型?我只在 Firefox 上遇到这个问题,在 Chrome 上我确实得到了 csv mime 类型。
【解决方案2】:

如果 mime 类型未知,则始终使用application/octet-stream

【讨论】:

  • 有没有办法让它知道?
【解决方案3】:

您列出的所有 MIME 类型都显示为 http://filext.com/file-extension/CSV 上 csv 文件的常见 MIME 类型

所以基本上我会说这取决于哪个程序生成了 .csv 文件以及他们决定使用哪种 mime 类型。

【讨论】:

    【解决方案4】:

    $_FILE['something']['type'] 由浏览器/用户操作系统填充,因此不可靠。您应该在服务器端自行检查以确定上传的文件是否为所需格式。

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 2018-09-11
      • 2021-11-15
      • 2012-01-18
      • 2012-07-28
      • 2011-06-17
      相关资源
      最近更新 更多