【发布时间】: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 的下载更容易,但不知何故,文件正在发生变异。我只是使用校验和差异作为显示差异的一种手段。我希望这能更好地解释我的意思!
-
是的,这就是我需要知道的。如果您使用
curl或wget下载,是否有4 个空格?如果没有,那么您需要查看编写文档的文件并找出 PHP 内部结构。
标签: php codeigniter http md5