2

我正在尝试从 Kohana 模型中将文件发送到浏览器,但是一旦我添加了 Content-Length 标头,该文件就不会立即开始下载。

现在问题似乎是 Kohana 已经在输出缓冲区了。脚本开头的 ob_clean 对此没有帮助。将 ob_get_length() 添加到 Content-Length 也无济于事,因为它只返回 0。getFileSize() 函数返回正确的数字:如果我在 Kohana 之外运行脚本,它就可以工作。

我读到 exit() 仍然调用所有析构函数,可能是 Kohana 之后输出了一些东西,但我无法找出究竟是什么。

希望有人可以在这里帮助我...

这是我正在使用的一段代码:

public function download() {
        header("Expires: ".gmdate("D, d M Y H:i:s",time()+(3600*7))." GMT\n");
        header("Content-Type: ".$this->getFileType()."\n");
        header("Content-Transfer-Encoding: binary\n");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s",$this->getCreateTime()) . " GMT\n");
        header("Content-Length: ".($this->getFileSize()+ob_get_length()).";\n");
        header('Content-Disposition: attachment; filename="'.basename($this->getFileName())."\"\n\n");
        ob_end_flush();

        readfile($this->getFilePath());
        exit();
}
4

3 回答 3

4

使用 Kohana 发送文件有一种更简单的方法。如果你使用的是Kohana 2.x,它是这样完成的......

download::force('./application/downloads/file.txt');

文档

如果您使用的是Kohana 3.x,它是这样完成的......

$this->request->send_file('./application/downloads/file.txt');

文档

于 2010-05-27T01:06:02.673 回答
0

发现我需要调用 Kohana::close_buffers(FALSE) 来清除 Kohana 的输出缓冲区。这是一个漫长的搜索,但现在它有效。

于 2010-04-05T19:44:06.217 回答
0

在 3.1 及更高版本中,使用

Request::current()->response()->send_file(FILENAME);

花了我一些时间所以希望这可以帮助某人

文档

于 2012-05-04T18:50:01.910 回答