【发布时间】:2012-12-10 07:56:24
【问题描述】:
我在一个项目中遇到了一个严重的问题,我已经从事了一段时间了。
用户将文件上传到课程。上传脚本获取文件名,用下划线替换空格,删除文件扩展名,添加一个 4 位数字,然后重新添加扩展名。
但是,文件完美地上传到服务器(直接从“上传”文件夹打开时,它们很好)。下载到用户电脑后,除 DOCX 文件和图像外,所有文件均已损坏。
打开下载的文件时,PDF、Excel (xlsx) 和 powerpoint (pptx) 会给出错误消息:“文件已损坏,无法打开”。
我要下载的代码是:
<?php
class download extends Controller {
public function resource ($filename)
{
$filepath = realpath('./uploads/resources/courses/' . $filename);
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Pragma: no-cache');
readfile($filepath);
}
}
它是一个 MVC,所以它在一个类中,$filename 是从文件名的 $_GET 变量中检索的。
任何帮助将不胜感激!
【问题讨论】:
-
你能区分未修改和下载后文件的内容吗?它们至少具有完全相同的字节大小吗?当您在文本编辑器中打开下载的文件时。文件的开头或结尾是否有不规则的内容。例如PHP 错误信息?
-
请首先仔细检查
$filepath是否存在(否则给出错误消息),并且在header之前或readfile调用之后没有发送额外的输出。 -
好的,我现在已经设法让它下载 pdf,但是 excel 和 powerpoint 仍然存在损坏问题。我确保 realpath 返回 true。此外,我在“我的文档”中上传的文件与下载的文件大小相同。