When I worked on laravel local development server php artisan storage:link works fine for me. But when I transfer my site to production server then I saw my public
php artisan storage:link
Another simple way is to run Executing php artisan storage:link Command Programmatically
On routes/web.php
Route::get('/foo', function () { Artisan::call('storage:link'); });