【问题标题】:PHP all files other than images and DOCX are corrupt on downloadPHP 除图像和 DOCX 以外的所有文件在下载时均已损坏
【发布时间】: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。此外,我在“我的文档”中上传的文件与下载的文件大小相同。

标签: php excel pdf download


【解决方案1】:

您确定下载的文件的文件名中没有空格或其他特殊字符吗?因为当文件名中存在空格或其他特殊字符时会发生此类问题。

【讨论】:

  • 我使用的测试文件被称为 https.xlsx 所以..它不可能有。
【解决方案2】:

看来你需要

header("Content-Length: " . filesize($filepath));
ob_clean();
flush();
readfile($file);
exit;

见:How to Automatically Start a Download in PHP?

另见:Corrupted .docx download using phpdocx

【讨论】:

  • 这救了我!谢谢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多