Quan executes php artisan storage:link, aquest comandament crea un enllaç simbòlic entre public/storage i storage/app/public. Aquest error indica que l'enllaç simbòlic ja existeix, per tant no el pot tornar a crear.
Solució:
- Revisa si dins de public/ ja hi ha la carpeta storage (que és l’enllaç simbòlic).
- Si existeix i és funcional, no cal tornar-lo a crear. L'enllaç ja està correctament establert.
- Si necessites tornar a crear l'enllaç per algun motiu, primer esborra l'enllaç existent:
rm public/storage
- (Pots fer-ho mitjançant Windows Explorer o amb un entorn bash tipus Git Bash) I després torna a executar:
php artisan storage:link
1. Entendre el Problema
En un entorn de desenvolupament local, normalment faries servir el comandament següent per crear un enllaç simbòlic del directori storage/app/public al directori public/storage:
php artisan storage:link
Això crea un enllaç simbòlic perquè els fitxers emmagatzemats a storage/app/public siguin accessibles públicament a través de public/storage.
2. Problema en Hosting Compartit
En molts entorns de hosting compartit, és possible que no puguis crear enllaços simbòlics amb el comandament php artisan storage:link a causa de les limitacions del servidor (per exemple, deshabilitació d'enllaços simbòlics per seguretat).
3. Solució Manual en Hosting Compartit
Pas 1: Copia el Contingut Manualment
Com que pot ser que no puguis crear enllaços simbòlics, la solució consisteix a copiar manualment el contingut del directori storage/app/public al directori public/storage.
- Pas a pas:
- Accedeix al teu hosting compartit mitjançant FTP o el gestor de fitxers del cPanel.
- Navega fins al directori storage/app/public del teu projecte Laravel.
- Copia tot el contingut d'aquest directori.
- Enganxa aquest contingut dins del directori public/storage.
Pas 2: Configura el Directori Correctament
És important que cada vegada que afegeixes o modifiques fitxers a storage/app/public, repliquis aquests canvis manualment a public/storage.
4. Automatitzar amb un Script
Si prefereixes no fer-ho manualment cada vegada, pots crear un simple script PHP o utilitzar un script en el teu servidor que faci la còpia de fitxers automàticament.
Exemple de script en PHP per copiar fitxers:
<?php
$source = __DIR__.'/../storage/app/public';
$destination = __DIR__.'/storage';
function copyFiles($source, $destination)
{
$directory = opendir($source);
@mkdir($destination);
while ($file = readdir($directory)) {
if ($file != '.' && $file != '..') {
if (is_dir($source . '/' . $file)) {
copyFiles($source . '/' . $file, $destination . '/' . $file);
} else {
copy($source . '/' . $file, $destination . '/' . $file);
}
}
}
closedir($directory);
}
copyFiles($source, $destination);Instruccions:
- Guarda aquest script com copy_storage.php al teu directori arrel de Laravel.
- Executa’l al servidor mitjançant navegador o una crida HTTP si és necessari.
5. Consideracions
- Permisos: Assegura't que el directori public/storage té els permisos correctes per permetre l'accés públic.
- Seguretat: Revisa que el directori storage i altres continguts sensibles no són directament accessibles des del web (evita exposar el directori storage/app completament).
Conclusió
Amb aquests passos, podràs crear un accés directe al directori storage en un hosting compartit, fins i tot si no pots utilitzar enllaços simbòlics. La solució manual és senzilla però efectiva, i pots automatitzar el procés si cal.