【问题标题】:User uploads Excel sheet - filetype is application/octet-stream用户上传 Excel 工作表 - 文件类型为 application/octet-stream
【发布时间】:2019-04-01 01:27:35
【问题描述】:

我有一个 web 应用程序正在运行,laravel 后端,用户上传 Excel 电子表格,然后将其存储在数据库中,base64 编码。大多数情况下这工作正常并且文件被存储,看起来像:

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

然而,最近一位用户遇到了问题,她的文件被上传并存储为:

data:application/octet-stream;base64,UEsDBBQACAgIAGVKWk0AAAAAAAAAAAAAA

如果我下载她的文件,它们会显示为完全正常的 Excel 工作表,如果我再次上传它们,即使没有打开它们,它们也会作为 XML 电子表格上传。

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

【问题讨论】:

标签: excel laravel file-upload base64


【解决方案1】:

就我而言,问题与浏览器无关。我们尝试从在 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

没有 MS Office 的机器上的浏览器接受文件:

Content-Type: application/octet-stream

【讨论】:

  • 这也正是我的问题。我花了一段时间才弄明白!
【解决方案2】:

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

在这种情况下,用户从 Chromebook 上的 Google 云端硬盘下载了 Google 表格(格式为 .xlsx),然后将 xls 上传给了我。该文件很好(并且可以解释为 .xlsx 文件),但不同 Chromebook 上文件开头的 MIME 类型可能是:

data:application/octet-stream;base64

或者只是

data:;octet-stream

结论:不要太相信文件上传的 MIME 类型。

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 2019-10-16
    • 2021-11-15
    • 2012-04-16
    • 2018-03-18
    • 2011-11-21
    • 2023-03-22
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多