【问题标题】:md5 check sum does not match when downloading file下载文件时md5校验和不匹配
【发布时间】:2018-11-05 20:34:06
【问题描述】:

我似乎无法解决这个问题。我正在使用带有 HTTP 标头的 PHP 下载文件(Moodle .mbz 扩展名)。该文件首先使用 aws php sdk 从 Amazon S3 下载到服务器,该文件运行良好。问题是将文件从服务器下载到另一个工作站。无论我似乎改变了什么,工作站上的文件和服务器上的文件的 md5 校验和都不匹配。客户端无法恢复他们已下载到其工作站的 .mbz 文件。文件似乎发生了一些事情以某种方式对其进行更改,但我不知道是什么。

我参考过: 1.this tutorial 2.This similar SO question 以及通过谷歌获得的各种其他资源。我很绝望,如果可以的话,请帮助。我已确保 httpd.conf 文件中的压缩已关闭。在 php.ini 中完全关闭调试。我可以在我的开发和暂存环境中复制该问题。

这是直接下载的代码:

<?php
    if(!file_exists($filename))
    { 
        // file does not exist
        die('file '.$filename.' not found');
    } else 
    {
	$this->load->model('Job_model', 'job');
	$save_as = $this->job->get_file_name_from_key($filename);
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"$save_as\"");
        header("Expires: 0");
        header("Pragma: public");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Content-Length: " . filesize($filename));
        readfile($filename);
}

将 PHP 与 codeigniter 框架结合使用(如果相关)。

谢谢!

编辑:前 16 个字节的八进制转储显示使用上述代码下载的文件的开头附加了 4 个空格,而不是服务器上的文件。

【问题讨论】:

  • 只是为了确认一下:如果你用其他程序下载它,摘要就可以了吗?所以你真的是在说:为什么我的代码不能以符合 MD5 的方式下载?
  • @benc 对不起,我不确定我是否完全理解你。直接从服务器提取的文件是有效的(在 Moodle 中恢复正常),使用我发布的代码下载的文件(我在服务器上构建的 Web 应用程序中的下载按钮)似乎以某种方式更改了文件,使其不再将恢复为moodle的“有效”文件。这种下载方法应该使 ITC 的下载更容易,但不知何故,文件正在发生变异。我只是使用校验和差异作为显示差异的一种手段。我希望这能更好地解释我的意思!
  • 是的,这就是我需要知道的。如果您使用curlwget 下载,是否有4 个空格?如果没有,那么您需要查看编写文档的文件并找出 PHP 内部结构。

标签: php codeigniter http md5


【解决方案1】:

这与其说是一个答案,不如说是一个实验建议。

我想知道是否存在 mime 问题。我发现this file 在第 145 行将“mbz”的 mime 类型描述为“application/vnd.moodle.backup”。也许通过更改 Content-Type 标头,您可以获得更好的结果。

据我了解,“mbz”基本上是一个 zip 文件。所以尝试将以下内容添加到 /application/config/mimes.php 的底部。

'mbz' => array('application/vnd.moodle.backup', 'application/zip'),

如果您想涵盖所有基础,您可以将定义扩展为

'mbz' => array('application/vnd.moodle.backup', 'application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),

它采用了 zip 类型的所有可能性,并将“默认”设置为“application/vnd.moodle.backup”。我会先尝试更简单的版本。

试试这个标题

 header("Content-Type: application/vnd.moodle.backup");

【讨论】:

  • 感谢您的建议!不幸的是,它仍然产生相同的结果。
【解决方案2】:

所以我找到了this question,特别是来自 MrPanda 的答案。我浏览了我在控制器中调用/初始化的所有帮助程序和库(我编写的),并在关闭 php 标记后删除了所有空格。问题解决了。感谢尝试帮助我的用户!两天的挫折终于结束了。

【讨论】:

  • 很高兴您找到了解决方案。您可能要考虑尽可能删除关闭的 php 标记。阅读this page of PHP documentation 的第三段了解基本原理。
  • 更多关于删除关闭 PHP 标记的想法HERE
猜你喜欢
  • 2016-01-18
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多