我似乎无法解决这个问题。我正在使用带有 HTTP header 的 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 个空格被附加到使用上述代码下载的文件与服务器上的文件的开头。
最佳答案
这与其说是一个答案,不如说是一个实验建议。
我想知道是否有 mime 问题。我找到了 this file其中,在第 145 行,将“mbz”的 mime 类型描述为“application/vnd.moodle.backup”。也许通过更改 Content-Type header ,您可以获得更好的结果。
据我了解,“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");
关于php - 下载文件时 md5 校验和不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161804/