我正在开发一个网站,允许教师上传文件,学生可以下载文件。但是,有一个问题。 Microsoft Word(.docx)文件下载完美,但下载excel(xlsx)文件时,excel会显示“此文件已损坏且无法打开”对话框。任何有关这方面的帮助将不胜感激!
我的下载代码如下:
case 'xlsx':
header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Pragma: no-cache');
readfile('./uploads/resources/courses/' . $filename);
break;
答案 0 :(得分:2)
这在我的本地xampp设置上运行正常,无论扩展如何,所以从我的角度来看,除非我遗漏了某些内容,否则不需要大小写声明
我已经测试过docx,accdb,xlsx,mp3,等等......
$filename = "equiv1.xlsx";
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Pragma: no-cache');
答案 1 :(得分:2)
我有这个问题,是BOM。
解压缩:使用解压缩检查输出文件,我在第二行看到了警告。
$ unzip -l file.xlsx
Archive: file.xlsx
warning file: 3 extra bytes at beginning or within zipfile
...
xxd(十六进制查看器):我使用以下命令看到前5个字节
head -c5 file.xlsx | xxd -g 1
0000000: ef bb bf 50 4b PK...
注意3个第一个字节ef bb bf
的BOM!
可能是带有BOM的php文件或来自库的先前输出。
你必须找到带有BOM的文件或命令的位置,在我的情况下,现在,我没有时间找到它,但我用输出缓冲区解决了这个问题。
<?php
ob_start();
// ... code, includes, etc
ob_get_clean();
// headers ...
readfile($file);
答案 2 :(得分:0)
试试这个:
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Type: application/vnd.ms-excel");
答案 3 :(得分:0)
尝试:
<?
//disable gzip
@apache_setenv('no-gzip', 1);
//set download attachment
header('Content-Disposition: attachment;filename="filename.xlsx"');
//clean the output buffer
ob_clean();
//output file
readfile('filepath/filename.xlsx');
//discard any extra characters after this line
exit;
?>
答案 4 :(得分:0)
尝试添加其他标题
header('Content-Length: ' . filesize('./uploads/resources/courses/' . $filename));
答案 5 :(得分:0)
可能是Windows提供的非常误导性信息,与代码,Excel库或服务器无关,文件本身就是正确的文件。 Windows阻止打开一些从Internet下载的文件(例如.xlsx),而不是询问是否要打开不安全的文件,它只是写出该文件已损坏。在Windows 10中,需要右键单击该文件,然后选择“ 取消阻止”(例如,您可以在此处阅读更多信息:https://winaero.com/blog/how-to-unblock-files-downloaded-from-internet-in-windows-10/)