6

我正在开发一个允许教师上传文件和学生下载文件的网站。但是,有一个问题。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;
4

6 回答 6

3

我有这个问题,是BOM

如何注意到它

unzip:使用 unzip 检查输出文件,我在第二行看到了警告。

$ 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...

ef bb bf注意BOM的前 3 个字节!

为什么?

可能是带有 BOM 的 php 文件或库的先前输出。

您必须找到带有 BOM 的文件或命令在哪里,就我而言,现在,我没有时间找到它,但我用输出缓冲区解决了这个问题。

<?php
ob_start();

// ... code, includes, etc

ob_get_clean();
// headers ...
readfile($file);
于 2015-08-18T21:20:54.320 回答
2

无论扩展名如何,这在我的本地 xampp 设置上都可以正常工作,因此从我的角度来看,除非我遗漏了什么,否则不需要 case 语句

我已经用 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');
于 2012-12-18T19:01:20.907 回答
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; 
?>
于 2013-05-15T23:03:59.600 回答
0

尝试添加一个额外的标题

header('Content-Length: ' . filesize('./uploads/resources/courses/' . $filename));
于 2015-01-25T07:39:41.983 回答
0

尝试这个:

header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Type: application/vnd.ms-excel");
于 2012-12-18T17:28:51.247 回答
0

可能这是Windows 提供的非常具有误导性的信息,与代码、Excel 库或服务器无关,文件本身是正确的。Windows 阻止打开从 Internet 下载的某些文件(如 .xlsx),而不是询问您是否要打开不安全的文件,它只是写该文件已损坏。在 Windows 10 中,需要右键单击文件并选择“取消阻止”(您可以在此处阅读更多信息:https ://winaero.com/blog/how-to-unblock-files-downloaded-from-internet-在 Windows-10/ 中

于 2020-07-22T15:39:22.520 回答