Skip to content

File Downloads

Sometimes you want to send files to the browser for download instead of displaying them.
NixPHP gives you full control to stream files using a custom response.


Downloading a File

You can manually create a response that forces a file download:

use function NixPHP\response;

$filePath = BASE_PATH . '/storage/files/example.pdf';
$fileName = 'example.pdf';

$response = response(file_get_contents($filePath))
    ->withHeader('Content-Type', 'application/octet-stream')
    ->withHeader('Content-Disposition', 'attachment; filename="' . $fileName . '"');

return $response;
  • Content-Type tells the browser this is a generic file download.
  • Content-Disposition: attachment forces the download dialog.
  • The file is loaded into the response body.

Example: Download Controller

namespace App\Controllers;

use function NixPHP\response;

class FileController
{
    public function download($filename)
    {
        $path = BASE_PATH . '/storage/files/' . basename($filename);

        if (!file_exists($path)) {
            abort(404, 'File not found.');
        }

        return response(file_get_contents($path))
            ->withHeader('Content-Type', 'application/octet-stream')
            ->withHeader('Content-Disposition', 'attachment; filename="' . basename($filename) . '"');
    }
}
  • Always use basename() to prevent directory traversal attacks.
  • Always check if the file actually exists before sending it.

Notes

  • For large files, you may want to implement streaming to avoid memory issues.
  • You can adjust Content-Type based on the file type if needed (e.g., application/pdf for PDFs).

Example for PDF:

return response(file_get_contents($pdfPath))
    ->withHeader('Content-Type', 'application/pdf')
    ->withHeader('Content-Disposition', 'attachment; filename="document.pdf"');

Summary

  • Use response(file_get_contents($path)) to build file download responses.
  • Always set proper headers (Content-Type, Content-Disposition).
  • Always sanitize filenames to prevent security issues.