如何修复这个损坏文件的 PHP 下载脚本?

2024-04-21

我有一个强制下载脚本,可以在 PDF 和纯文本中产生良好的结果,并且在 ZIP 存档中半正常(它们在 Windows 中工作,而不是在 Linux 中工作)。但是,应用程序文件和图像都失败。这些构成了我必须处理的绝大多数文件。正如我在此处看到的类似主题所建议的那样,压缩所有下载并不是一种选择。

失败的文件会下载到完整大小,并以正确的名称写入磁盘。尝试打开它们会导致错误消息,不同类型的错误消息有所不同。将下载的文件与原始文件进行比较hexdump,我可以看到脚本在每个下载文件的开头插入以下字符:

ef bb bf

然后,下载的文件将复制原始文件,直到其停止在指定大小 - 因此原始文件的最后 6 个字符始终会丢失。

不幸的是,我对二进制文件是如何组成的,这些字符可能意味着什么,或者脚本如何/为什么插入它们一无所知。

这是原样的脚本:

$file = '94.ppt';
$path = $_SERVER['DOCUMENT_ROOT']."/relative/path/";
$full_path = $path.$file;
if ($fd = fopen ($full_path, "r")) {
    $fsize = filesize($full_path);
    $path_parts = pathinfo($full_path);
    $ext = strtolower($path_parts["extension"]);
    switch ($ext) {
        case "pdf":
            header("Content-type: application/pdf");
            header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
        break;
        case "txt":
            header("Content-type: text/plain");
            header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
        break;
        case "jpg":
            header("Content-type: image/jpeg");
            header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
        break;
        case "ppt":
            header("Content-Type: application/vnd.ms-powerpoint");
            header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
        break;
        default;
            header("Content-type: application/octet-stream");
            header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    }
    header("Content-Transfer-Encoding: binary");
    header("Content-length: $fsize");
    header("Cache-control: private");
    while(!feof($fd)) {
        $buffer = fread($fd, 2048);
        echo $buffer;
    }
}
fclose ($fd);
exit;

开发系统是 Apache 2.2.14 (Ubuntu) 上的 PHP 5.3.2-1。生产主机是 Apache 2.0.63(某种类型的 Linux)上的 PHP 5.2.9。


您的 PHP 脚本文件似乎被编码为带 BOM 的 UTF-8 http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8就在打开之前文件的开头<?php分隔符。这些字节在实际输出之前发送,从而损坏您的数据。

您只需删除它并配置编辑器不使用 UTF-8 的 BOM。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复这个损坏文件的 PHP 下载脚本? 的相关文章

随机推荐

  • Android 应用程序在调用 System.exit(0) 后不会关闭

    在添加 Admob 活动之前 我有一个运行良好的 Android 应用程序 我正在通过终止进程来关闭我的应用程序 调用 System exit 0 我知道这是完成应用程序的最糟糕的解决方案 我正在使用 OpenGL 状态和 libgdx f
  • 为什么我应该由 setTimeout 调度的函数调用立即执行? [复制]

    这个问题在这里已经有答案了 这是我的问题 我有这个功能来测试代理服务器 function crawl var oldstatus document getElementById status innerHTML document getEl
  • 如何统计字符串中大写字母、小写字母和数字的个数?

    我想用 C 编写一个程序 它从用户那里获取一个字符串 并输出大写字母 小写字母和数字的数量 例如对于输入 aKb12CD34 结果应为 2 个小写字母 3 个大写字母和 4 个数字 Try include
  • PHP Stream_socket_client 的最大套接字数

    我需要检查数百个 URL 并使用stream socket client为每个URL创建套接字 然后使用stream select来检索它们并评估它们的响应时间等 但是 在创建 237 个套接字之后 我无法再创建套接字 没有错误代码或消息表
  • ASP.NET MVC3 Razor 视图 - VS2010 中编辑速度极慢

    我有一个用 ASP NET MVC3 编写的相对较小的项目 工作一段时间后 Visual Studio 2010 在 Razor 视图中变得非常慢 其他文件类型工作正常 我所说的 慢 是指 每次击键大约需要 1 秒才能注册 击键是什么并不重
  • 远程服务器返回错误:(407) 需要代理身份验证

    当我调用网络服务时出现此错误 远程服务器返回错误 407 需要代理身份验证 我了解了总体思路 并且可以通过添加来使代码正常工作 myProxy Credentials NetworkCredential user password doma
  • Java中的paint()和repaint()

    我可能花了两个小时浏览和阅读这些方法和 Graphics 类 也许我很愚蠢 哈哈 但我只是不理解它们 它们是做什么用的 我知道他们应该重绘或更新屏幕上的组件 但我从来不明白为什么需要这样做 我对此很陌生 例如 如果我在屏幕上移动 JLabe
  • 锁定 HttpRuntime.Cache 以进行延迟加载

    我们有一个运行 NET 2 0 的网站 并开始使用 ASP Net HttpRuntime Cache 来存储频繁数据查找的结果 以减少数据库访问 Snippet lock locker if HttpRuntime Cache cache
  • 网站不会在移动设备上滚动[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个网站 http www skeletoncru com 不会在移动设备上滚动 我以前见过这个问题 但这似乎不是通常的嫌疑人 我没主意了
  • Sql语法:select without from子句作为select中的子查询(subselect)

    在编辑一些查询以添加没有值的列的替代项时 我不小心写了这样的内容 这是简单的版本 SELECT id SELECT name FROM t 令我惊讶的是 MySQL 没有抛出任何错误 而是完成了查询 给出了我预期的结果 name列值 我试图
  • 在 Odoo 10 的表单视图中向 One2Many 树添加多条记录

    我目前正在 Odoo 10 中创建一个小部件 它有一个按钮 用户可以单击此按钮 然后会出现一个对话框 允许用户选择多个记录并将它们添加到相应的 One2Many 字段 例如 我可以选择多个产品并将它们添加到新的销售订单中 相应的订单行将添加
  • 如何在rails中执行任意参数化SQL

    出于性能原因 我需要在 Rails 模型中编写一个新方法来执行一些任意 SQL UPDATE table SET col1 AND col2 WHERE id 我明白我可以使用ActiveRecord Base connection exe
  • 在 R 中撤消布局

    我最初创建了一个箱线图和直方图组合的图 为此我设置了 nf lt layout mat matrix c 1 2 2 1 byrow TRUE height c 1 3 par mar c 2 2 1 1 Draw box plot Dra
  • Jawbone UP API oAuth 和访问令牌

    我今天开始深入研究 Jawbone 的 UP API 整个身份验证过程中一切似乎都很顺利 问题是 一旦我取回访问令牌 它始终是相同的令牌 它在我的任何请求中都不起作用 并且我无法使用刷新令牌端点更改它 oAuth 设置 url params
  • 提高谷歌地图绘制长路径的性能

    这个问题和这个不一样另一个 https stackoverflow com questions 7503848 improving google maps performance因此 我观察到原生谷歌地图应用程序在地图上绘制很长的距离 当缩
  • PyQt QtWebKit loadFinished 未调用

    我有这个脚本 当它准备好时我想用它做更多的事情 from PyQt4 import QtCore QtGui QtWebKit class WebViewCreator def init self self view QtWebKit QW
  • 为什么 JavaScript 换行符在 HTML 中不起作用?

    我有以下内容 你们可能都知道 n不起作用 我必须使用 br 反而 如果我链接到外部 它也不起作用 js文件 这是我的问题 为什么不 n work 为什么 br 甚至工作 脚本标签内的所有内容难道不应该是严格的 JavaScript 而不是
  • openaigym env.P,AttributeError“TimeLimit”对象没有属性“P”

    我目前正在阅读 Sudharsan Ravichandiran 的 Python 强化学习实践 在我遇到的第一个示例中 遇到了以下 AttributeError AttributeError TimeLimit object has no
  • 将文本+图标组合成一个自动换行的小部件

    我正在尝试为我的应用程序创建一个帮助页面 我想简单地写 按 ICON 刷新分数 或在设置抽屉中启用自动刷新 其中 ICON 是 Icons refresh 如果屏幕不适合 则将整个内容自动换行 如果都是文本 我会简单地将其包装在灵活的小部件
  • 如何修复这个损坏文件的 PHP 下载脚本?

    我有一个强制下载脚本 可以在 PDF 和纯文本中产生良好的结果 并且在 ZIP 存档中半正常 它们在 Windows 中工作 而不是在 Linux 中工作 但是 应用程序文件和图像都失败 这些构成了我必须处理的绝大多数文件 正如我在此处看到