Laravel 5.4 Showing 404 Not Found (Public Storage)

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Laravel 5.4 Showing 404 Not Found: Mastering Public Storage Access

As developers working with the Laravel framework, managing file storage is one of the most common stumbling blocks. Storing files securely on the server and making them accessible via a web browser involves juggling file system paths, public directories, and symbolic links. The issue you are facing—receiving a 404 Not Found error when trying to display files from your public storage folder—is extremely common. It usually stems from a misunderstanding of how Laravel maps the internal storage structure to the public URL space.

This post will walk you through exactly why this happens in Laravel, how the symbolic linking mechanism works, and provide the definitive, best-practice solution for serving files in your application.

Understanding the Laravel Storage Structure

When you use methods like storeAs() in Laravel, by default, files are saved within the storage/app/public directory. This directory is intentionally kept outside the publicly accessible public folder to maintain a separation between application logic and public assets.

To make these files accessible via a URL (like yourdomain.com/storage/filename), Laravel requires you to create a symbolic link. This link essentially tells the web server that anything requested from the public/storage path should actually be routed to the contents of storage/app/public.

The command you ran, php artisan storage:link, is crucial for establishing this connection:

bash
php artisan storage:link

This command creates a symbolic link inside your public directory, pointing to storage/app/public. This setup is fundamental to leveraging Laravel’s file management capabilities effectively. Following best practices in application architecture, understanding these internal mappings is key to building robust applications, as emphasized by the principles of modern framework development found at laravelcompany.com.

Diagnosing the 404 Error

The confusion often arises when trying to access the files using different paths:

  1. Failing Path (e.g., /public/storage/filename): If you are relying on standard web routing or directly accessing the path after linking, a 404 suggests that either the symbolic link was not created correctly, or the web server configuration is blocking access to that specific subdirectory structure.
  2. Working Path (e.g., /storage/filename): In some setups, explicitly referencing the storage directory might work if you are using custom routes or middleware configured specifically for storage access.

The most reliable way to ensure public assets are accessible is by consistently using Laravel’s built-in helper functions, which abstract away these file system complexities.

The Correct Solution: Using the Storage Facade

Instead of manually constructing paths and relying solely on symbolic links, the modern and robust solution is to use the Storage facade provided by Laravel. This method handles the path resolution internally, making your code cleaner, more secure, and less prone to 404 errors.

Step 1: File Insertion (Review)

Ensure your file insertion logic uses the correct storage mechanism:

php
use Illuminate\Support\Facades\Storage;

// ... inside your controller method
$path = $request->file('image')->storeAs('public', $filename); // Stores in storage/app/public/filename

Step 2: Displaying the File in the View

To display the file, use the Storage::url() method. This method automatically generates the correct public URL for you, regardless of where the file is stored internally.

html
@foreach($home_slider as $get_data_slider)
    @if($get_data_slider->slider_sorting == '1')
        {{-- Use Storage::url() to generate the publicly accessible path --}}
        <a href="{{ Storage::url('public/' . $get_data_slider->file) }}" target="_blank">
            <img src="{{ Storage::url('public/' . $get_data_slider->file) }}" class="d-block w-100">
        </a>
    @endif
@endforeach

Note on Pathing: When using storeAs('public', ...) in the code, the file resides in storage/app/public. The symbolic link connects public/storage to this location. Therefore, when retrieving the URL, you reference the path as if it were located under the linked public folder, usually prefixed by storage.

The most straightforward implementation for assets stored in the public disk is:

html
<img src="{{ asset('storage/' . $get_data_slider->file) }}" class="d-block w-100">

This approach leverages the asset() helper combined with the symbolic link you established earlier, providing a unified and reliable way to access all public files.

Conclusion

The 404 error in file storage scenarios is almost always a symptom of mismatched expectations between the file system structure and the web routing layer. While symbolic links are foundational, relying on Laravel's built-in facade methods like Storage::url() or the asset() helper ensures that your application remains resilient to changes and adheres to modern architectural standards. By embracing these tools, you ensure that your public assets are served correctly and efficiently, keeping your development process smooth and predictable.