Laravel menyediakan sistem penyimpanan file yang rapi melalui fitur filesystem. Salah satu perintah yang sering digunakan saat membuat aplikasi Laravel adalah php artisan storage:link. Perintah ini berguna untuk membuat symbolic link dari folder storage/app/public ke folder public/storage.
Fitur ini penting karena file yang disimpan di dalam folder storage secara default tidak bisa langsung diakses oleh browser. Browser hanya bisa mengakses file yang berada di dalam folder public. Karena itu, Laravel menyediakan mekanisme storage link agar file upload seperti gambar profil, dokumen, thumbnail, atau lampiran dapat diakses melalui URL publik dengan cara yang aman dan terstruktur.
Apa Itu Storage Link di Laravel?
Storage link adalah symbolic link yang menghubungkan folder private storage Laravel ke folder publik aplikasi. Secara default, file public Laravel disimpan di:
storage/app/public
Agar file tersebut bisa diakses dari browser, Laravel membuat shortcut ke:
public/storage
Setelah link dibuat, file yang berada di:
storage/app/public/avatar/user.jpg
dapat diakses melalui URL:
https://domain.com/storage/avatar/user.jpg
Dengan cara ini, aplikasi tetap memiliki struktur penyimpanan yang jelas tanpa harus menyimpan file upload langsung ke folder public.
Cara Membuat Storage Link
Cara paling disarankan untuk membuat storage link adalah menggunakan perintah Artisan:
php artisan storage:link
Jika berhasil, Laravel akan menampilkan pesan bahwa link sudah dibuat. Setelah itu, folder public/storage akan muncul sebagai symbolic link menuju storage/app/public.
Pastikan Anda menjalankan perintah tersebut dari folder project yang benar, yaitu folder yang memiliki file:
artisan
composer.json
app/
storage/
public/
Jika perintah dijalankan dari folder yang salah, Laravel tidak akan bisa menemukan file artisan.
Cara Manual Membuat Symbolic Link
Selain menggunakan Artisan, symbolic link juga bisa dibuat secara manual melalui terminal dengan perintah `ln -s`.
Contoh perintah manualnya:
cd public
ln -s /home/username/project/storage/app/public storage
Namun, untuk Laravel modern, cara manual ini hanya digunakan jika php artisan storage:link tidak bisa dijalankan atau server memiliki konfigurasi khusus.
Contoh Menyimpan File Upload ke Storage Public
Misalnya Anda ingin menyimpan gambar yang diupload dari form. Contoh controller sederhana:
public function upload(Request $request)
{
$request->validate([
'photo' => ['required', 'image', 'max:2048'],
]);
$path = $request->file('photo')->store('photos', 'public');
return response()->json([
'path' => $path,
'url' => asset('storage/' . $path),
]);
}Kode di atas akan menyimpan file ke:
storage/app/public/photos
Jika file bernama abc.jpg, maka URL publiknya menjadi:
https://domain.com/storage/photos/abc.jpg
Bagian penting dari kode tersebut adalah penggunaan disk public:
store('photos', 'public')Tanpa disk public, file bisa saja tersimpan ke disk default yang tidak bisa diakses dari browser.
Konfigurasi Filesystem Laravel
Konfigurasi storage Laravel berada di file:
dapat kamu temukan pada config dibawah ini
file ini sudah tersedia bawaan.
config/filesystems.phpBiasanya disk public sudah tersedia secara default:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
Pastikan APP_URL di file .env sudah sesuai dengan domain aplikasi:
APP_URL=https://domain.com
Jika APP_URL salah, URL file yang dihasilkan bisa tidak sesuai.
Permission Folder Storage
Di server production, masalah yang sering terjadi bukan pada perintah storage:link, tetapi pada permission folder. Laravel perlu akses tulis ke folder storage dan bootstrap/cache.
Gunakan ownership yang benar, misalnya user deploy adalah psbhost dan web server menggunakan group www-data:
sudo chown -R psbhost:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
Jangan memberi permission 777 kecuali dalam kondisi debugging sementara. Permission 777 terlalu longgar dan tidak aman untuk production.
Error yang Sering Terjadi
Jika muncul error:
The public/storage directory already exists.
artinya link atau folder public/storage sudah ada. Cek dulu:
ls -la public/storage
Jika itu symbolic link yang benar, tidak perlu dibuat ulang. Jika itu folder biasa dan salah, hapus lalu buat ulang:
rm -rf public/storage
php artisan storage:link
Jika gambar tetap tidak muncul, cek apakah file benar-benar ada:
ls -la storage/app/public
Lalu pastikan web server dapat membaca file tersebut.
Praktik Terbaik di Production
Untuk production, storage link biasanya dibuat sekali saat setup server atau dimasukkan ke script deploy. Contoh:
php artisan storage:link || true
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
Namun, jangan menjalankan perintah sembarangan dengan sudo jika tidak diperlukan. Perintah Laravel sebaiknya dijalankan oleh user deploy yang memiliki akses benar ke folder project.
Selain itu, jangan menyimpan file sensitif seperti KTP, invoice private, atau dokumen internal di disk public. Jika file hanya boleh diakses oleh user tertentu, simpan di disk private lalu buat endpoint download dengan validasi authorization.
Kesimpulan
Storage link pada Laravel adalah fitur penting untuk menampilkan file upload secara publik. Perintah php artisan storage:link membuat hubungan antara storage/app/public dan public/storage, sehingga file dapat diakses melalui URL browser.
Agar fitur ini berjalan dengan benar, pastikan file disimpan menggunakan disk public, konfigurasi APP_URL sudah tepat, permission folder benar, dan symbolic link tidak rusak. Untuk aplikasi production, gunakan storage public hanya untuk file yang memang aman diakses publik. File sensitif harus tetap disimpan secara private dan dilayani melalui controller dengan authorization yang ketat.
