Я должен был сделать что-то, что вы хотели бы иметь.Итак, я расширил sfActions с помощью myActions и добавил метод:
/**
*
* @param string $path
* @param string $mimetype
* @return sfView::NONE
*/
public function downloadFile($path, $mimetype, sfRequest $request) {
if (is_file($path) && is_readable($path)) {
$this->setLayout(false);
sfConfig::set('sf_web_debug', false);
$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($path) . '"');
$this->getResponse()->setHttpHeader('Content-type', $mimetype);
$this->getResponse()->setHttpHeader('Pragma: public', true);
$this->getResponse()->setHttpHeader('Expires', 0);
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding', 'binary');
$this->getResponse()->setHttpHeader('Content-Length', filesize($path));
$this->getResponse()->sendHttpHeaders();
file_put_contents(sfConfig::get('sf_upload_dir').'/test.txt', var_export($_SERVER, 1) . 'TEST');
if($request->isMethod(sfRequest::HEAD))
$this->getResponse()->setContent('');
else
$this->getResponse()->setContent(file_get_contents($path));
}
else
$this->forward404('Unreadable file', 'json');
return sfView::NONE;
}
и использовал этот метод для действий от маршрутизации.Например, у нас есть модель Author и mp3 для нее.Итак, в routing.yml:
author_show:
url: /api/authors/:id.:sf_format
class: sfDoctrineRoute
options: { model: Author, type: object }
param: { module: author, action show }
requirements:
sf_format: (?:mp3)
В действии:
switch($request->getParameter('sf_format')) {
case 'mp3':
$path = sfConfig::get('sf_upload_dir') . '/authors/audio/' . $author->getAboutAudio();
$mimetype = 'audio/mpeg';
break;
default:
$this->forward500('Unknown format. Only mp3 format is available.', 'json');
}
return $this->downloadFile($path, $mimetype, $request);
Кроме того, вы можете сохранить его в некоторой подпапке при загрузке и защитить его с помощью .htaccess, например
deny from all