为什么我将mime类型的.csv文件作为“application / octet-stream”?

时间:2012-08-21 18:39:14

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

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

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

什么事?

4 个答案:

答案 0 :(得分:44)

在这些时候,官方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”。但是,在PHP方面没有检查这个mime类型,因此不会将其值视为理所当然。

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

答案 1 :(得分:18)

如果mime类型未知,则始终使用

application/octet-stream

答案 2 :(得分:0)

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

所以基本上我会说它归结为哪个程序生成.csv文件以及他们决定使用哪个mime-type。

答案 3 :(得分:0)

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