首页 > 解决方案 > 为什么 Chrome 会在我的 xlsx 文件末尾添加两个选项卡,这样做会损坏文件?

问题描述

我正在使用 yii2 开发一个应用程序,我正在使用 PhpSpreadsheet 生成(Excel) .xlsx文件。当我用 Chrome 下载生成的.xlsx文件时,我无法用 Excel (2019) 打开它,因为 Excel 提示文件已损坏,提出修复但失败。

首先我怀疑生成器或下载过程有问题,但我已经用 Firefox、Edge 和 Filezilla 测试了下载 - 一切都按预期工作。

十六进制下载文件的比较只显示了一个细微差别:在使用其他浏览器下载的 .xlsx 文件的末尾,我看到

786d 6c2e 7265 6c73 504b 0506 0000 0000
0b00 0b00 d102 0000 671d 0000 0000 

但 Chrome 下载显示

786d 6c2e 7265 6c73 504b 0506 0000 0000
0b00 0b00 d102 0000 671d 0000 0000 0909

我不知道这些额外的 09 是从哪里来的。这是两个选项卡 (09) chrome 正在添加并因此损坏文件。OpenOffice 的 Calc 能够读取它,但 Excel 无法打开它。

所以,我的问题是:为什么 Chrome 似乎在我的文件末尾添加了两个标签?我能做些什么来防止这种情况发生?

更新: 我已将问题缩小到“使用 Chrome 登录”(登录到 yii 应用程序,而不是 Chrome!)。含义:我可以使用 Firefox 和 Edge 下载并打开文件,登录或未登录,我未登录时它可以与 Chrome 一起使用我会责怪登录,但这也会损坏文件/添加 2 个额外的 09当我用 Firefox 或 Edge 下载它时...

更新 2: 我已经安装了基于 Chromium 引擎的新 Edge 版本 78.0.276.17(官方构建)测试版(64 位):同样的问题!登录:文件损坏。未登录:文件有效!

更新 3: 我测试了一个通过 FTP 上传的随机 file.txt,当我通过 yii 的 sendFile-Method 下载它时,文件末尾添加了 2 个选项卡:

public function actionTest(){
   Yii::$app->response->sendFile('test.txt')->send();
   return true;
}

如果我通过直接链接来下载文件,那就很好了。再次,它似乎是 Chromium、正在登录和 sendFile 方法的组合。

标签: phpexcelgoogle-chromeyii2

解决方案


解决方案是:

正如@MichalHynčica 所建议的,我的i8n 翻译文件 .../frontend/languages/de-DE/app.php前面有两个标签<?php!删除这两个选项卡会导致下载的文件非常好。

编辑:除此之外,Chromium 引擎似乎忽略了 HTTP 标头中定义的内容长度和下载文件的实际内容长度。

谢谢,晚安。


推荐阅读