php - 为什么 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 方法的组合。
解决方案
解决方案是:
正如@MichalHynčica 所建议的,我的i8n 翻译文件 .../frontend/languages/de-DE/app.php
前面有两个标签<?php
!删除这两个选项卡会导致下载的文件非常好。
编辑:除此之外,Chromium 引擎似乎忽略了 HTTP 标头中定义的内容长度和下载文件的实际内容长度。
谢谢,晚安。
推荐阅读
- python - Bokeh PATCH-DOC ping-pong 重置绘图
- php - .json 文件一直为空
- sas - 使用 Proc Transpose 时如何防止变量名的前导下划线
- javascript - 如何在 javascript 中使用另一个文件中的变量和函数?
- docker - Docker:如何通过存储一些登录凭据来创建映像
- r - 为满足 R 中的一个条件的条目创建具有特定值的新列
- php - 在使用 php 接收到 MySQL 结果之后,如何将它们按类型分组,但在编码为 json 之前?
- performance - 用左连接删除
- spring-boot - 无法在 Gradle 5.x 中使用 bootRun addresources=true
- python - 从 for 循环返回的具有相同索引的 Concat 数据帧