Sling Academy
Home/PHP/File Response in Laravel: An Example-Driven Guide

File Response in Laravel: An Example-Driven Guide

Last updated: January 18, 2024

Introduction

Laravel, a robust PHP framework, simplifies the task of handling file responses with its fluent API and expressive syntax. In this guide, we will delve into the process of working with file responses using Laravel’s built-in functionality, illustrating the concepts with practical examples.

Before you proceed, ensure you have Laravel installed and running on your local development environment. This guide will use Laravel 10, which is the latest stable release at the time of writing.

Serving Files Directly

To serve files directly in Laravel, you can use the response()->file() method. Here’s a simple controller method that serves an image file from storage:

use Illuminate\Http\Request;

public function showImage(Request $request)
{
    $path = storage_path('images/my-image.jpg');
    return response()->file($path);
}

This creates a response that will display the image directly in the user’s browser while maintaining the original headers and file name.

Download Responses

If you want users to download files rather than viewing them in the browser, you can use the response()->download() method:

use Illuminate\Http\Request;

public function downloadFile(Request $request)
{
    $filePath = storage_path('files/my-document.pdf');
    $fileName = 'CustomDocumentName.pdf'; // You can specify a custom name for the download

    return response()->download($filePath, $fileName);
}

Laravel will send appropriate headers to force the file download. You can also pass an optional third parameter of headers to the download method.

Download Responses with Headers

The following example adds custom headers to a file download response:

use Illuminate\Http\Request;

public function downloadFileWithHeaders(Request $request)
{
    $filePath = storage_path('files/my-document.csv');
    $headers = [
        'Content-Type' => 'text/csv',
        'Content-Disposition' => 'attachment; filename="CustomFileName.csv"',
    ];

    return response()->download($filePath, 'ExportedData.csv', $headers);
}

The Content-Disposition header customizes the downloaded file name, and the Content-Type states the file’s MIME type.

Serving Large Files

When you’re dealing with large file downloads, you may need to use the response()->streamDownload() method:

use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\StreamedResponse;

public function downloadLargeFile(Request $request): StreamedResponse
{
    return Storage::disk('local')->download('large-video.mp4');
}

This is more memory-efficient as it handles the file in chunks, preventing your application from running out of memory on large file operations.

Forcing File Downloads

To force files to download without needing to create a response stream or a separate controller method, you can use named routes with the ‘download’ option in your web.php file:

use Illuminate\Support\Facades\Route;

Route::get('download/{filename}', function ($filename) {
    $path = storage_path('files/' . $filename);

    if (!file_exists($path)) {
        abort(404);
    }

    return response()->download($path);
})->name('download.file');

This sets up a direct route to download files from storage.

Serving Files with Laravel’s Filesystem

Laravel provides an elegant filesystem abstraction through the Illuminate\Support\Facades\Storage facade. This abstraction can be beneficial when serving files:

public function showPdf()
{
    return response()->file(storage_path('app/public/sample.pdf'));
}

This constructs a response for the file directly, leveraging Laravel’s built-in Storage facade.

Zipping Files on the Fly

If you need to serve multiple files as a zip archive, you can do so on the fly:

use ZipArchive;
use Illuminate\Http\Response;

public function downloadMultipleFiles(Request $request)
{
    // Create a new ZipArchive instance
    $zip = new ZipArchive();
    $zipPath = storage_path('app/public/') . "myFiles.zip";

    if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) {
        // Add files to the zip
        $zip->addFile(storage_path('app/public/image.jpg'), 'image.jpg');
        $zip->addFile(storage_path('app/public/document.pdf'), 'document.pdf');
        // Close the zip
        $zip->close();

        return response()->download($zipPath)->deleteFileAfterSend(true);
    }

    return abort(500, 'Could not create the zip archive.');
}

The deleteFileAfterSend method deletes the archive after it’s downloaded, cleaning up server storage.

Conclusion

This guide reviewed the basics of serving and downloading files using Laravel. File handling is a common task in web development, and Laravel’s fluent API makes it manageable and intuitive. Use these examples to efficiently manage file responses in your own Laravel applications.

Next Article: How to define type hints for request parameters in Laravel

Previous Article: How to return stream response in Laravel (for large files)

Series: Laravel & Eloquent Tutorials

PHP

You May Also Like

  • Pandas DataFrame.value_counts() method: Explained with examples
  • Constructor Property Promotion in PHP: Tutorial & Examples
  • Understanding mixed types in PHP (5 examples)
  • Union Types in PHP: A practical guide (5 examples)
  • PHP: How to implement type checking in a function (PHP 8+)
  • Symfony + Doctrine: Implementing cursor-based pagination
  • Laravel + Eloquent: How to Group Data by Multiple Columns
  • PHP: How to convert CSV data to HTML tables
  • Using ‘never’ return type in PHP (PHP 8.1+)
  • Nullable (Optional) Types in PHP: A practical guide (5 examples)
  • Explore Attributes (Annotations) in Modern PHP (5 examples)
  • An introduction to WeakMap in PHP (6 examples)
  • Type Declarations for Class Properties in PHP (5 examples)
  • Static Return Type in PHP: Explained with examples
  • PHP: Using DocBlock comments to annotate variables
  • PHP: How to ping a server/website and get the response time
  • PHP: 3 Ways to Get City/Country from IP Address
  • PHP: How to find the mode(s) of an array (4 examples)
  • PHP: Calculate standard deviation & variance of an array