我正在开发一个必须将Excel文件导入MySQL的PHP应用程序。所以我需要将Excel文件转换为.csv格式。但是当我想使用来获得它的类型时$_FILE['something']['type'],我就得到application/octet- stream了它的mime-type。 我认为这里有问题。因为我将以下列表收集为.csv文件mime-type:
$_FILE['something']['type']
application/octet- stream
text/comma-separated-values, text/csv, application/csv, application/excel, application/vnd.ms-excel, application/vnd.msexcel
怎么了 ?
在这种情况下,官方的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标头本身。
Content- Type
Content-Type
Content-Type: application/octet-stream
现在,当我们将其与有关POST文件上传 文档 的PHP手册一起考虑时,我们将看到以下内容:
$_FILES['userfile']['type'] 文件的MIME类型(如果浏览器提供了此信息)。 一个例子是“ image / gif”。但是,不会在PHP端检查此mime类型,因此不要将其值视为理所当然。
$_FILES['userfile']['type']
文件的MIME类型(如果浏览器提供了此信息)。 一个例子是“ image / gif”。但是,不会在PHP端检查此mime类型,因此不要将其值视为理所当然。
如您所见,即使$_FILES['userfile']['type']已指定,它也仅对应于Content- Type客户端发送的标头。此信息很容易被伪造,因此不应依赖。如果需要 确保 上传的文件是特定类型,则必须验证自己。