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

Moh*_*eri 41 php csv file-format http-headers mime-types

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

text/comma-separated-values,  
text/csv,  
application/csv, 
application/excel, 
application/vnd.ms-excel, 
application/vnd.msexcel
Run Code Online (Sandbox Code Playgroud)

怎么了 ?

rdl*_*rey 44

在这些时候,官方的HTTP规范总是有用的.来自RFC 2616 7.2.1(我的重点补充):

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

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

现在,当我们结合关于POST文件上传文档PHP手册条目考虑这一点时,我们看到以下内容:

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

文件的mime类型,如果浏览器提供了此信息.一个例子是"image/gif".但是,在PHP端没有检查这个mime类型,因此不会将其值视为理所当然.

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


小智 19

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

  • 有没有办法让它知道? (4认同)