为什么我获取的.csv文件的MIME类型为“application/octet-stream”?

47

我正在开发一个PHP应用程序,需要将Excel文件导入MySQL。因此,我需要将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 应用程序中遇到过这种情况。 - Pablo
请注意,如果您的文件大小超过了php.ini中的“upload_max_filesize”设置,则会收到“application/octet-stream”而不是预期的MIME类型。 - Arash
4个回答

54
在这种情况下,官方的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手册条目关于POST文件上传docs考虑时,我们会看到以下内容:

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

如果浏览器提供了此信息,则为文件的MIME类型。例如:"image/gif"。但是,此MIME类型在PHP端不进行检查,因此不要将其值视为确定。

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


我们理解这一点,但如果遇到这个问题,该怎么办呢?当用户上传CSV文件时,应该采取什么措施来提供有效的MIME类型?我只在Firefox上遇到了这个问题,在Chrome上我可以得到CSV MIME类型。 - Whip

23

application/octet-stream 如果无法确定MIME类型时,通常会使用它。


11
有办法让它为人所知吗? - user936965

0

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


-1

你列出的所有 MIME 类型都出现在 http://filext.com/file-extension/CSV 上,作为 CSV 文件的常见 MIME 类型。

所以基本上我想问题就在于生成 .csv 文件的程序以及他们决定使用哪种 MIME 类型。


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