The FileServeBundle allows you to serve files that are not publicly available, such as private attachments.
Add the bundle to your composer.json
:
{
"require": {
"igorw/file-serve-bundle": "~1.0"
}
}
Add the FileServeBundle to your application's kernel:
public function registerBundles()
{
$bundles = array(
// ...
new Igorw\FileServeBundle\IgorwFileServeBundle(),
// ...
);
// ...
}
Use the igorw_file_serve.response_factory
service to create a FileServe
response. The path is relative to the app
directory by default.
$response = $this->get('igorw_file_serve.response_factory')->create('../VERSION', 'text/plain');
You can also pass a set of options as the third parameter of the create
method.
$options = array(
'serve_filename' => 'VERSION.txt',
'absolute_path' => true,
'inline' => false,
);
$response = $this->get('igorw_file_serve.response_factory')
->create('../VERSION', 'text/plain', $options);
- serve_filename: Filename the browser downloads the file as.
- absolute_path: If enabled, the bundle will ignore the
base_dir
option and use the provided filename as an absolute path.
You can configure the factory used, for example to use a nginx XSendfile response factory:
igorw_file_serve:
factory: sendfile # The default value is "php"
You can also configure the base directory:
igorw_file_serve:
base_dir: /files/dir # The default value is "%kernel.root_dir%"
By default, this bundle does a file_exists
check when creating a response
object. Recent nginx versions require relative paths, in which case the paths
inside of PHP are not actual physical paths. Use the skip_file_exists
setting to disable the check.
igorw_file_serve:
skip_file_exists: true # The default value is false
php
sendfile
(nginx)xsendfile
(apache)
- Incremental serving of large files
- Nginx XSendfile
- Apache mod_xsendfile
- Tests
- HTTP caching
- HTTP range requests
- Lighttpd XSendfile
- Handle PhpResponse getContent(), setContent()