用户上载Excel工作表-文件类型为应用程序/八位字节流

用户上载Excel工作表-文件类型为应用程序/八位字节流,excel,laravel,file-upload,base64,Excel,Laravel,File Upload,Base64,我有一个运行的web应用程序,laravel后端,用户上传Excel电子表格,然后将其存储在数据库中,base64编码。通常情况下,这可以正常工作,并且文件已存储,如下所示: data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,UEsDBBQABgAIAAAAIQBi7p1oXgEAAJAEAAA 然而,最近一个用户出现了问题,她的文件被上传并存储为: data:application/oc

我有一个运行的web应用程序,laravel后端,用户上传Excel电子表格,然后将其存储在数据库中,base64编码。通常情况下,这可以正常工作,并且文件已存储,如下所示:

data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,UEsDBBQABgAIAAAAIQBi7p1oXgEAAJAEAAA
然而,最近一个用户出现了问题,她的文件被上传并存储为:

data:application/octet-stream;base64,UEsDBBQACAgIAGVKWk0AAAAAAAAAAAAAA
如果我下载她的文件,它们会显示为完美的Excel表格,如果我再次上传,即使没有打开它们,它们也会作为XML电子表格上传


我从哪里开始寻找问题?这种编码是在什么阶段确定的?是上传操作系统,上传浏览器,还是拉拉维尔在幕后做什么?我不是Laravel专家。

正如@ourmandave所指出的,浏览器没有100%可靠的方法来确定MIME类型:

在这种情况下,用户从Chromebook(as.xlsx)上的GoogleDrive下载了一份Google工作表,然后将xls上传给我。该文件很好(可以解释为.xlsx文件),但不同Chromebook上文件开头的MIME类型可能是:

data:application/octet-stream;base64
或者只是

data:;octet-stream

结论:在上传文件时不要太相信MIME类型

在我的例子中,问题与浏览器无关。我们试图从运行Windows的多台计算机上载Microsoft Excel工作表(.xlsx)文件。使用了与Chrome(83.0.4103.106版)、Edge(83.0.478.54版)和Firefox(77.0.1(64位))相同的浏览器版本

安装了MS Office的计算机与未安装的计算机之间出现了差异

在带有MS office的计算机上,所有浏览器都接受具有以下内容的文件:

Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Type: application/octet-stream
未安装MS Office的计算机上的浏览器接受了以下文件:

Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Type: application/octet-stream

最近发生了什么变化?她是否使用不同的浏览器,或者更改了Excel版本,或者使用不同的文件格式保存文件?也许它以前是.xls,她把它改成了.xlsx。我发现她用的是Chromebook,而电子表格原来是谷歌表格。必须找到一个Chromebook复制..这正是我的问题,以及。我花了一段时间才弄明白!