0

我有一个使用 readfile() 下载大文件 (1.3gb) 的脚本。

如果我创建一个仅包含脚本的 .php 页面,它可以正常工作,但如果我将相同的脚本放在 Snippet 中并将其放在页面上,则不会发生任何事情。

ModX 是如何阻止下载的吗?任何建议都会非常感谢!

编辑代码:

$file = $_SERVER['DOCUMENT_ROOT']."/movie.mov";
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
};
4

1 回答 1

0

Modx 确实有一个最大文件大小设置 [Maximum upload size upload_maxsize] 但这是针对文件管理器的。我怀疑这是你的问题。

让我们看看脚本和错误日志。

更新

刚刚测试了你的小片段[有几个小的改动]~它工作得很好。

$base_path = $modx->config['base_path'];

$movie = 'frankenweenie-mrwhiskers_r640s.mov';

$file = $base_path.$movie;


if (file_exists($file)) {

    echo 'file exists '.filesize($file);

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);

    return true;

}else{

    echo 'file does not exist';

    return false;

}

使用 $modx->config['base_path'] 不是你的问题,它也可以使用服务器变量,这只是一个好习惯。就像返回的真/假 modx 期望它的片段返回一些东西,无论是真,假还是 $output ......而且,不是你的问题它没有工作。

开始查看您的 php 设置,我认为内存限制可能是问题所在。检查 php 文档并查看它是否需要有足够的内存来读取该大小的文件。[即使它表明“大小无关紧要”]

在脚本本身中启用错误日志并检查服务器错误日志。

它适用于小文件吗?然后看这里:PHP readfile() and large downloads

祝你好运!

于 2012-10-09T01:04:16.843 回答