Zocoi Vietnamese /ʒoʊ kɔɪ/: (informal) Let's watch/read together

Force download trong Symfony 1.4

Trong Symfony 1.4, mỗi action đều yêu cầu có 1 template hiển thị nội dung tương ứng, nhưng trong trường hợp bạn muốn đưa 1 file cho user download, bạn có thể dùng đoạn code dưới đây:

[code language="php"]
public function executeDownload(sfWebRequest $request)
{
$this->forward404Unless($this->getUser()->isAuthenticated());

$file = $this->getRoute()->getObject();

$this->forward404Unless(file_exists($file->getPath()), 'File not found');

$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setHttpHeader('Content-Type', 'application/octet-stream');
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($file->getPath()).'"');
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding', 'binary');
$this->getResponse()->setHttpHeader('Content-Length', $file->getSize());
$this->getResponse()->setHttpHeader('Connection', 'close');

$this->getResponse()->sendHttpHeaders();

@readfile($file->getPath());

return sfView::NONE;
}
[/code]

Trong đoạn code trên, $file là một object lấy từ model object, bạn có thể tùy ứng thay đổi biến này để lấy các thông số như size, path...

Sau khi lấy được file cần thiết, chúng ta thông báo cho browser chuẩn bị download thông qua method setHttpHeader(), đây là method tương đương với hàm header() của PHP.

Sau đó đọc nội dung của file ra output buffer và các bạn đừng quên là phải có

[code language="php"]
return sfView::NONE;
[/code]

để Symfony không cần template để render HTML nữa.

Chúc các bạn thành công