用户上传 Excel 表格 - 文件类型为 application/octet-stream。

4
我是一名有用的助手,可以为您翻译以下内容:

我有一个正在运行的Web应用程序,使用Laravel后端,用户上传Excel电子表格,然后将其存储在数据库中进行Base64编码。大多数情况下,这很好用,文件被存储,看起来像:

data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,UEsDBBQABgAIAAAAIQBi7p1oXgEAAJAEAAA

然而,最近有一个用户遇到了问题,她的文件被上传并存储为:
data:application/octet-stream;base64,UEsDBBQACAgIAGVKWk0AAAAAAAAAAAAAA

如果我下载她的文件,它们会显示为完好无损的Excel表格,即使我不打开它们,只要我再次上传它们,它们就会上传为XML电子表格。
我应该从哪里开始寻找问题?在哪个阶段确定这种编码方式?是上传操作系统、上传浏览器,还是Laravel在幕后做了一些事情?我不是Laravel专家。

1
最近发生了什么变化?她是否使用了不同的浏览器,或更改了Excel版本,或者以不同的文件格式保存文件?也许以前是.xls格式,现在改成了.xlsx格式。 - ourmandave
这里有一个关于浏览器如何确定正在上传的文件的MIME类型的答案。 - ourmandave
我发现她在使用Chromebook,而且电子表格最初是一个Google Sheet。必须找到一台Chromebook来复制。 - Dan
2个回答

3
正如@ourmandave所指出的那样,浏览器没有一种100%可靠的方法来确定MIME类型:浏览器中的MIME类型 在这种情况下,用户从Chromebook上下载了一个Google Drive上的Google Sheet(作为.xlsx文件),然后上传了xls文件给我。该文件很好(可以解释为.xlsx文件),但是不同Chromebook上文件开头的MIME类型可能会有所不同:
data:application/octet-stream;base64

或者只是
data:;octet-stream

结论:不要过分信任文件上传时的 MIME 类型。

3

我的情况与浏览器无关。我们尝试从几台运行Windows的机器上传Microsoft Excel工作表(.xlsx)文件。使用了相同版本的Chrome(版本83.0.4103.106)、Edge(版本83.0.478.54)和Firefox(77.0.1(64位))浏览器。

不同之处在于安装了MS Office的机器和未安装MS Office的机器之间。

对于安装了MS Office的机器,所有浏览器都接受该文件:

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

没有安装MS Office的计算机上的浏览器可以接受以下文件:

Content-Type: application/octet-stream

1
这正是我的问题,也花了我一段时间才解决! - Nick

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