为什么我将哑剧类型的.csv文件设置为“应用程序/八位字节流”?

2022-08-30 11:11:44

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

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

怎么了?


答案 1

在这样的时代,官方的HTTP规范总是有帮助的。来自 RFC 2616 7.2.1(我的着重号是后加的):

任何包含实体正文的 HTTP/1.1 消息都应包含定义该正文的媒体类型的内容类型标头字段。当且仅当媒体类型不是由“内容类型”字段给出的,收件人可能会尝试通过检查媒体类型的内容和/或用于标识资源的 URI 的扩展名来猜测媒体类型。如果媒体类型仍然未知,收件人应将其视为类型“应用程序/八位字节流”。

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

现在,当我们将此与有关POST文件上传文档的PHP手动条目结合使用时,我们会看到以下内容:

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

文件的哑剧类型(如果浏览器提供了此信息)。一个例子是“图像/gif”。但是,这种哑剧类型不会在PHP端进行检查,因此不会将其值视为理所当然。

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


答案 2

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


推荐