Cara Membuat Storage Link Laravel Tanpa Perintah Artisan
Laravel menyediakan sistem penyimpanan file yang terstruktur melalui folder storage. Folder ini digunakan untuk menyimpan berbagai data seperti file upload, gambar produk, dokumen, cache, log, dan file sementara aplikasi.
Untuk file yang perlu diakses secara publik, Laravel biasanya menyimpannya di dalam folder:
storage/app/public
Namun, folder tersebut tidak dapat langsung diakses melalui browser karena berada di luar folder public aplikasi.
Laravel menggunakan symbolic link atau symlink untuk menghubungkan folder tersebut ke:
public/storage
Biasanya, storage link dibuat menggunakan perintah:
php artisan storage:link
Masalahnya, tidak semua pengguna memiliki akses terminal atau SSH. Beberapa shared hosting juga membatasi fungsi symbolic link sehingga perintah Artisan tidak dapat dijalankan.
Pada tutorial ini, Anda akan mempelajari beberapa cara membuat storage link Laravel tanpa menggunakan perintah Artisan.
Apa Itu Storage Link pada Laravel?
Storage link adalah symbolic link yang menghubungkan dua lokasi folder.
Secara default, Laravel membuat hubungan berikut:
public/storage
mengarah ke:
storage/app/public
Dengan storage link, file yang disimpan melalui disk public dapat diakses menggunakan URL website.
Contohnya, file berada di:
storage/app/public/products/gambar.jpg
Setelah storage link dibuat, file tersebut dapat diakses melalui:
https://domainanda.com/storage/products/gambar.jpg
Tanpa storage link, browser tidak dapat menemukan file tersebut meskipun file sudah tersimpan di server.
Mengapa Storage Link Diperlukan?
Storage link dibutuhkan ketika aplikasi Laravel menangani file seperti:
Gambar produk
Foto profil
Dokumen pelanggan
File invoice
Lampiran artikel
Logo perusahaan
Bukti pembayaran
Berkas pengguna
File hasil upload lainnya
Laravel sengaja memisahkan folder penyimpanan dan folder public untuk menjaga struktur aplikasi tetap aman dan terorganisasi.
Hanya file yang memang ditujukan untuk akses publik yang sebaiknya disimpan di dalam:
storage/app/public
Penyebab Perintah Storage Link Tidak Bisa Digunakan
Beberapa kondisi yang membuat pengguna tidak dapat menjalankan php artisan storage:link antara lain:
Hosting tidak memiliki akses SSH.
Terminal cPanel tidak tersedia.
Fungsi
symlink()dinonaktifkan.Permission folder tidak sesuai.
Folder
public/storagesudah tersedia.Struktur Laravel berada di luar
public_html.Hosting membatasi pembuatan symbolic link.
Path project Laravel berbeda dengan document root domain.
Dalam kondisi tersebut, storage link dapat dibuat menggunakan metode alternatif.
Cara 1: Membuat Storage Link Menggunakan File PHP
Metode pertama adalah menggunakan fungsi symlink() melalui file PHP sementara.
Metode ini cocok jika hosting mengizinkan fungsi symbolic link tetapi tidak menyediakan terminal.
Buat file baru di folder public website.
Contohnya:
public_html/create-storage-link.php
Isi file tersebut dengan kode berikut:
<?php
$target = '/home/username/laravel-app/storage/app/public';
$link = '/home/username/public_html/storage';
if (file_exists($link)) {
exit('Folder atau link storage sudah tersedia.');
}
if (symlink($target, $link)) {
echo 'Storage link berhasil dibuat.';
} else {
echo 'Storage link gagal dibuat.';
}
Sesuaikan bagian berikut:
$target = '/home/username/laravel-app/storage/app/public';
dengan lokasi folder storage Laravel Anda.
Kemudian sesuaikan:
$link = '/home/username/public_html/storage';
dengan lokasi folder public website.
Setelah file dibuat, akses melalui browser:
https://domainanda.com/create-storage-link.php
Jika berhasil, akan muncul pesan:
Storage link berhasil dibuat.
Setelah selesai, segera hapus file create-storage-link.php karena file tersebut tidak boleh dibiarkan dapat diakses secara publik.
Contoh Struktur Laravel di cPanel
Misalnya struktur folder hosting Anda seperti berikut:
/home/username/laravel-app
/home/username/public_html
Core Laravel berada di:
/home/username/laravel-app
Sedangkan domain mengarah ke:
/home/username/public_html
Maka konfigurasi file PHP-nya adalah:
<?php
$target = '/home/username/laravel-app/storage/app/public';
$link = '/home/username/public_html/storage';
if (!file_exists($link)) {
symlink($target, $link);
echo 'Storage link berhasil dibuat.';
} else {
echo 'Storage link sudah tersedia.';
}
Pastikan username dan nama folder disesuaikan dengan hosting Anda.
Cara 2: Menggunakan Path Dinamis
Jika tidak mengetahui absolute path server, Anda dapat menggunakan path dinamis.
Buat file di public_html:
<?php
$target = __DIR__.'/../laravel-app/storage/app/public';
$link = __DIR__.'/storage';
if (file_exists($link)) {
exit('Storage sudah tersedia.');
}
if (symlink($target, $link)) {
echo 'Storage link berhasil dibuat.';
} else {
echo 'Storage link gagal dibuat.';
}
Namun, metode ini hanya bekerja jika posisi folder Laravel dan public_html sesuai dengan struktur tersebut.
Untuk menghindari kesalahan, absolute path biasanya lebih aman.
Cara 3: Membuat Symlink Melalui File Manager cPanel
Beberapa penyedia hosting menyediakan fitur symbolic link di File Manager.
Jika tersedia, langkahnya adalah:
Buka cPanel.
Masuk ke File Manager.
Buka folder
public_html.Pilih menu membuat symbolic link.
Masukkan target folder storage Laravel.
Tentukan nama link menjadi
storage.
Target yang digunakan:
/home/username/laravel-app/storage/app/public
Lokasi link:
/home/username/public_html/storage
Tidak semua versi cPanel memiliki fitur ini. Jika menu symbolic link tidak tersedia, gunakan file PHP sementara atau hubungi penyedia hosting.
Cara 4: Menggunakan Cron Job Sementara
Jika hosting tidak memiliki terminal tetapi menyediakan Cron Jobs, Anda dapat mencoba menjalankan perintah storage link melalui cron.
Tambahkan perintah seperti berikut:
cd /home/username/laravel-app && /usr/local/bin/php artisan storage:link
Lokasi PHP dapat berbeda di setiap hosting.
Beberapa contoh path PHP:
/usr/local/bin/php
/usr/bin/php
/opt/cpanel/ea-php83/root/usr/bin/php
Setelah cron berhasil dijalankan, segera hapus cron job tersebut.
Metode ini sebenarnya tetap menjalankan Artisan, tetapi tidak melalui terminal langsung. Jika tujuan Anda benar-benar tidak menggunakan Artisan sama sekali, gunakan fungsi symlink().
Cara 5: Menyalin File Storage ke Folder Public
Jika hosting benar-benar tidak mengizinkan symbolic link, salah satu alternatifnya adalah menyalin file dari storage ke folder public.
Contohnya, file disimpan langsung ke:
public/uploads
Kemudian file dapat diakses melalui:
https://domainanda.com/uploads/nama-file.jpg
Namun, metode ini tidak menggunakan struktur storage Laravel secara standar.
Kekurangannya:
Pengelolaan file menjadi kurang rapi.
File bercampur dengan aset public.
Perlu menyesuaikan kode upload.
Tidak otomatis mengikuti konfigurasi disk
public.Migrasi server menjadi lebih sulit.
Metode ini sebaiknya digunakan hanya jika symbolic link benar-benar tidak tersedia.
Mengatur Konfigurasi Filesystem Laravel
Buka file:
config/filesystems.php
Pastikan disk public menggunakan konfigurasi seperti berikut:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
'throw' => false,
],
Kemudian periksa file .env.
Pastikan:
APP_URL=https://domainanda.com
Jangan menggunakan URL localhost ketika aplikasi sudah berada di hosting.
Contoh yang salah:
APP_URL=http://127.0.0.1:8000
Contoh yang benar:
APP_URL=https://ovlamedia.com
Setelah mengubah konfigurasi, bersihkan cache Laravel jika memungkinkan.
php artisan optimize:clear
Jika tidak memiliki terminal, Anda dapat menghapus cache konfigurasi secara hati-hati melalui folder:
bootstrap/cache
Jangan menghapus file .gitignore.
Cara Menyimpan File ke Storage Public
Untuk menyimpan file upload, gunakan disk public.
Contoh:
$path = $request->file('image')->store('products', 'public');
File akan disimpan di:
storage/app/public/products
Nilai $path biasanya berupa:
products/nama-file.jpg
Untuk menampilkan gambar, gunakan:
<img src="{{ asset('storage/'.$path) }}" alt="Gambar Produk">
Atau menggunakan helper Storage:
<img src="{{ Storage::url($path) }}" alt="Gambar Produk">
Hasil URL-nya akan menjadi:
https://domainanda.com/storage/products/nama-file.jpg
Cara Mengecek Storage Link Berhasil atau Tidak
Setelah storage link dibuat, periksa folder public website.
Seharusnya terdapat:
public/storage
atau pada cPanel:
public_html/storage
Folder tersebut biasanya ditampilkan dengan ikon khusus sebagai symbolic link.
Kemudian uji dengan membuat file sederhana di:
storage/app/public/test.txt
Isi file tersebut dengan:
Storage Laravel berhasil.
Kemudian akses:
https://domainanda.com/storage/test.txt
Jika isi file muncul, berarti storage link berfungsi.
Error Folder Storage Sudah Ada
Saat membuat link, Anda mungkin mendapatkan pesan bahwa file atau folder sudah tersedia.
Hal ini terjadi karena folder berikut sudah ada:
public/storage
Periksa apakah folder tersebut merupakan symbolic link atau folder biasa.
Jika hanya folder biasa dan tidak berisi data penting, hapus terlebih dahulu.
Kemudian buat ulang symbolic link.
Jangan menghapus folder tanpa memeriksa isinya karena mungkin terdapat file upload yang masih digunakan.
Error Symlink Already Exists
Pesan seperti berikut dapat muncul:
File exists
Artinya lokasi link sudah tersedia.
Periksa menggunakan File Manager atau terminal.
Jika storage link lama mengarah ke lokasi yang salah, hapus link tersebut kemudian buat ulang.
Pada Linux:
rm public/storage
Perintah tersebut hanya menghapus symbolic link, bukan folder target, selama public/storage benar-benar merupakan symlink.
Error Operation Not Permitted
Pesan:
Operation not permitted
biasanya berarti hosting tidak mengizinkan fungsi symbolic link.
Solusi yang dapat dilakukan:
Hubungi penyedia hosting.
Minta bantuan pihak hosting membuat symlink.
Gunakan document root yang langsung mengarah ke folder
public.Simpan file upload ke folder public.
Pindahkan aplikasi ke VPS.
Gunakan object storage seperti Amazon S3 atau layanan sejenis.
Pada shared hosting tertentu, pengguna memang tidak memiliki izin membuat symlink.
Error Function Symlink Has Been Disabled
Jika muncul pesan:
Call to undefined function symlink()
atau:
symlink() has been disabled for security reasons
artinya fungsi PHP symlink() dinonaktifkan oleh server.
Anda tidak dapat mengaktifkannya sendiri jika menggunakan shared hosting.
Hubungi penyedia hosting dan minta mereka membuat symbolic link dengan target:
storage/app/public
menuju:
public/storage
Error 403 Forbidden pada Folder Storage
Jika storage link sudah ada tetapi file menampilkan Error 403, periksa beberapa hal berikut:
Permission folder.
Permission file.
Konfigurasi
.htaccess.Kepemilikan file.
Aturan keamanan hosting.
Path symbolic link.
Permission yang umum digunakan:
Folder:
755
File:
644
Folder Laravel berikut juga harus dapat ditulis:
storage
bootstrap/cache
Pada server tertentu, permission 775 mungkin diperlukan tergantung konfigurasi user dan group.
Error 404 File Tidak Ditemukan
Jika storage link tersedia tetapi file menghasilkan 404, periksa:
File benar-benar ada di
storage/app/public.Path file pada database sudah benar.
URL menggunakan
/storage/.Nama file tidak salah.
Huruf besar dan kecil sama.
APP_URLsudah sesuai.Cache konfigurasi telah dibersihkan.
Server Linux membedakan huruf besar dan kecil.
Contohnya:
Gambar.jpg
berbeda dengan:
gambar.jpg
Storage Link pada Struktur Public HTML Terpisah
Pada cPanel, Laravel sering menggunakan struktur:
/home/username/project-laravel
/home/username/public_html
Dalam kondisi ini, link default Laravel dapat mengarah ke:
/home/username/project-laravel/public/storage
Padahal domain menggunakan:
/home/username/public_html
Karena itu, link harus dibuat langsung di public_html.
Target:
/home/username/project-laravel/storage/app/public
Link:
/home/username/public_html/storage
Inilah penyebab storage link yang dibuat melalui Artisan kadang tidak langsung bekerja pada struktur shared hosting tertentu.
Membuat Script yang Lebih Aman
Gunakan script berikut agar proses pembuatan link memberikan informasi yang lebih jelas:
<?php
$target = '/home/username/laravel-app/storage/app/public';
$link = '/home/username/public_html/storage';
echo '<pre>';
if (!is_dir($target)) {
exit("Target storage tidak ditemukan:\n{$target}");
}
if (is_link($link)) {
exit("Symbolic link sudah tersedia:\n{$link}");
}
if (file_exists($link)) {
exit("Lokasi link sudah digunakan oleh file atau folder:\n{$link}");
}
if (!function_exists('symlink')) {
exit('Fungsi symlink tidak tersedia pada server.');
}
if (symlink($target, $link)) {
echo "Storage link berhasil dibuat.\n";
echo "Target: {$target}\n";
echo "Link: {$link}\n";
} else {
echo 'Storage link gagal dibuat.';
}
Setelah berhasil, hapus script dari server.
Keamanan Saat Membuat Storage Link
Beberapa hal penting yang perlu diperhatikan:
Jangan menyimpan data sensitif di disk public.
Jangan menaruh file
.envdi dalam storage public.Validasi setiap file upload.
Batasi jenis file yang diperbolehkan.
Batasi ukuran file upload.
Gunakan nama file yang aman.
Hindari menjalankan file PHP dari folder upload.
Hapus script pembuat symlink setelah digunakan.
File seperti dokumen rahasia, data pribadi, dan berkas internal sebaiknya disimpan pada disk private dan diakses melalui controller dengan autentikasi.
Alternatif Menggunakan Object Storage
Untuk aplikasi dengan kebutuhan penyimpanan yang lebih besar, Anda dapat menggunakan object storage.
Contohnya:
Amazon S3
Cloudflare R2
DigitalOcean Spaces
MinIO
Wasabi
Google Cloud Storage
Dengan object storage, file tidak perlu disimpan langsung di server aplikasi.
Keuntungannya:
Penyimpanan lebih mudah ditingkatkan.
File dapat didistribusikan melalui CDN.
Backup lebih mudah.
Beban server aplikasi berkurang.
Cocok untuk aplikasi dengan banyak file.
Laravel mendukung berbagai layanan penyimpanan melalui filesystem abstraction.
Checklist Pembuatan Storage Link
Gunakan checklist berikut untuk memastikan konfigurasi sudah benar:
Folder
storage/app/publictersedia.Folder target dapat dibaca.
Folder
public/storagebelum digunakan.Absolute path sudah benar.
Fungsi
symlink()tersedia.Permission folder sudah sesuai.
APP_URLsudah benar.Disk
publicsudah dikonfigurasi.URL file menggunakan
/storage/.Script pembuat link sudah dihapus.
File upload tidak mengandung file berbahaya.
Kapan Sebaiknya Menggunakan Artisan?
Meskipun storage link dapat dibuat tanpa Artisan, perintah berikut tetap menjadi metode standar Laravel:
php artisan storage:link
Gunakan metode Artisan jika:
Memiliki akses SSH.
Terminal cPanel tersedia.
Struktur folder Laravel standar.
Hosting mengizinkan symbolic link.
Document root mengarah ke folder
public.
Metode tanpa Artisan lebih cocok sebagai solusi alternatif ketika akses terminal tidak tersedia atau struktur hosting berbeda.
Mengapa Memilih Ovla Media?
Ovla Media menyediakan layanan pengembangan, deployment, dan perbaikan aplikasi Laravel untuk shared hosting maupun VPS.
Kami dapat membantu menangani berbagai kendala seperti:
Storage link tidak berfungsi
Gambar upload tidak tampil
Error 403 pada storage
File upload menghasilkan 404
Deploy Laravel ke cPanel
Konfigurasi folder
public_htmlVite Manifest Not Found
HTTP Error 500
Konfigurasi
.envMigrasi hosting
Konfigurasi VPS
Maintenance aplikasi Laravel
Setiap proses dilakukan dengan memperhatikan keamanan data, struktur aplikasi, performa, serta kemudahan maintenance di masa depan.
Kesimpulan
Storage link Laravel digunakan untuk menghubungkan folder storage/app/public dengan public/storage agar file upload dapat diakses melalui browser.
Jika Anda tidak memiliki akses terminal atau tidak dapat menjalankan php artisan storage:link, symbolic link dapat dibuat menggunakan fungsi PHP symlink(), fitur File Manager, atau bantuan penyedia hosting.
Konfigurasi yang paling penting adalah memastikan target dan lokasi link sudah benar.
Target:
storage/app/public
Link public:
public/storage
Pada struktur cPanel yang memisahkan project Laravel dan public_html, link harus dibuat langsung di dalam folder public yang digunakan domain.
Setelah storage link berhasil dibuat, pastikan file dapat diakses melalui URL /storage/, permission sudah sesuai, dan file PHP sementara segera dihapus demi keamanan.
Jika Anda membutuhkan bantuan untuk membuat storage link, memperbaiki file upload, melakukan deployment Laravel ke cPanel, atau mengelola server aplikasi, Ovla Media siap membantu memberikan solusi yang aman dan profesional.
Artikel Terkait
Cara Membuat Role dan Permission Laravel Tanpa Package
Role dan permission digunakan untuk membatasi akses pengguna berdasarkan tugas dan kewenangannya. Tanpa memasang package tambahan, Laravel dapat membuat sistem hak akses menggunakan migration, relasi Eloquent, middleware, Gate, Policy, dan Blade Directive. Artikel ini membahas pembuatan role dan permission dari awal, mulai dari struktur database, model, seeder, middleware, hingga penerapannya pada route dan tampilan.
Cara Integrasi WhatsApp Cloud API dengan Laravel
WhatsApp Cloud API memungkinkan aplikasi Laravel mengirim pesan, notifikasi, dan template WhatsApp melalui layanan resmi Meta. Integrasi ini dapat digunakan untuk konfirmasi pesanan, invoice, pengingat pembayaran, customer service, hingga chatbot. Artikel ini membahas konfigurasi token, pengiriman pesan, serta penerimaan webhook menggunakan Laravel.
Cara Membuat Sistem Multi-Cabang Menggunakan Laravel
Sistem multi-cabang memungkinkan beberapa lokasi usaha menggunakan satu aplikasi Laravel dengan data yang tetap terpisah. Setiap produk, transaksi, stok, pelanggan, dan pengguna dapat dihubungkan dengan cabang tertentu melalui kolom branch_id.