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:

 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;
 }
 

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ó

 return sfView::NONE;
 

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

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

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s