我似乎无法解决这个问题。我正在下载一个文件(moodle.mbz扩展名),使用带有http头的php。该文件首先使用aws php sdk从amazon s3下载到一个服务器上,该软件运行良好。问题是将文件从服务器下载到另一个工作站。无论我似乎做了什么更改,工作站上文件的md5校验和与服务器上文件的md5校验和都不匹配。客户端无法将已下载的.mbz文件还原到其工作站。文件似乎发生了一些变化,但我不知道是什么。
我引用了:
一。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个空格。

最佳答案

与其说这是一个答案,不如说是一个实验建议。
我想知道是否有哑剧问题。我发现this file在第145行,它将'mbz'的mime类型描述为'application/vnd.moodle.backup'。也许通过更改内容类型标题,可以获得更好的结果。
据我所知,“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");

09-10 06:51
查看更多