Der Laravel-Speicherlink funktioniert nicht in der Produktion

Lesezeit: 7 Minuten

Ich benutze storage_path um meine Bilder zu speichern und ich symbolisch meinen Speicherordner dazu public_html

php artisan storage:link

Auf der lokalen Seite funktioniert alles einwandfrei, wenn ich ein Bild hochlade, wird es in den Speicherordner hochgeladen und der Link davon wird darin angezeigt public Ordner, aber seit ich in den Live-Host- und Produktionsmodus gewechselt bin, werden meine Bilder in den Speicherordner hochgeladen, aber nichts in meinen public_html/storage und ich bin nicht in der Lage, sie in meinem Front-End zu bekommen.

Codes

/config/filesystems.php

'public' => [
  'driver' => 'local',
  'root' => storage_path('app/public/'),
  'url' => env('APP_URL').'/storage',
  'visibility' => 'public',
],

.env

FILESYSTEM_DRIVER=public

controller sample

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename="page" . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = storage_path('app/public/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

irgendeine Idee?

  • Du verwendest kein public Verzeichnis, das Sie verwenden public_html. Ich mag diese Strategie nicht. Erstellen Sie ein öffentliches Verzeichnis in public_html und setze die url zu env('APP_URL').'/public/storage'.

    – Oh Gott warum

    6. Juni 2018 um 22:10 Uhr


  • Sie müssen den Sym-Link auf dem Server neu erstellen, er wird nicht mit übertragen

    – ATechGuy

    6. Juni 2018 um 22:27 Uhr


  • @Ohgodwarum tut mir leid, aber ich bin verwirrt, 1) Make a public directory in public_html Ich habe Ordner in meinem public_html Es wurde erstellt, als ich den Handwerkerbefehl ausführte, 2) habe ich getan 'url' => env('APP_URL').'/public/storage', aber es hat sich nichts geändert, ich kann meine Bilder immer noch nicht abrufen

    – mafortis

    6. Juni 2018 um 22:30 Uhr

  • @ATechGuy wie mache ich das? Ich habe kein Terminal in meinem Host (nicht sicher!)

    – mafortis

    6. Juni 2018 um 22:30 Uhr

  • Sind Sie wirklich sicher, dass Sie verwenden sollten? $image->getClientOriginalExtension();? Das würde mir erlauben, eine .php-Datei auf Ihrem Server zu speichern und jeglichen Code darin auszuführen.

    – Schwester

    7. Juni 2018 um 3:54 Uhr

Benutzeravatar von Chetam Okafor
Chetam Okafor

Ich sehe, dass die Frage beantwortet wurde, aber ich möchte eine andere Lösung vorschlagen, die ich als einfach empfand. Gehen Sie zum Routenordner your-app-folder/routes/web.php und registrieren Sie eine neue Route wie folgt

Route::get('/linkstorage', function () {
    Artisan::call('storage:link');
});

gehen Sie dann auf Ihre Website www.example.com/linkstorage und Sie gelangen auf eine leere Seite. das ist es. Der Speicherordner wird erstellt. Ich hoffe es hilft jemandem.

  • Dies ist am einfachsten, es ist nicht erforderlich, den Pfad zu bearbeiten (der in vielen Umgebungen variieren kann). Jedes Mal, wenn Sie zum Produktionsserver migrieren, müssen Sie dies nur aufrufen.

    – Toni Tegar Sahidi

    19. November 2020 um 2:59 Uhr

  • Brillant!! Ich weiß nicht, warum das nicht in der offiziellen Laravel-Dokumentation steht … ich denke … Danke.

    – Adriana Hernández

    2. April 2021 um 11:04 Uhr


  • Kann bei mir auch nicht funktionieren.. Protokollfehler

    – ii iml0sto1

    25. August 2021 um 9:34 Uhr

  • @iiiml0sto1 Sie können auch eine Datei erstellen (z. B. symlink.php) in Ihrem öffentlichen Verzeichnis und fügen Sie die folgenden Codezeilen hinzu <?php symlink('/home/your-host-namespace/public_html/your-app-folder/storage/app/public', '/home/your-host-namespace/public_html/storage'); Sie können den Code auch entsprechend dem Speicherort Ihres Verzeichnisses anpassen. Wenn Sie fertig sind, besuchen Sie www.your-domain.com/symlink.php, und das sollte für Sie ausreichen.

    – Chetam Okafor

    28. August 2021 um 14:44 Uhr

Benutzeravatar von Abdel Rahman Kamhawy
Abdel Rahman Kamhawy

Löschen Sie den Ordnerspeicher aus dem öffentlichen Bereich und führen Sie diesen Befehl im Cron-Job aus (einmalig):

ln -s /home/public_html/storage/app/public /home/dev5/public_html/public/storage

  • Das hat bei mir funktioniert, nur dass Sie bei Verwendung von Laravel Sail wahrscheinlich Folgendes ausführen müssen: ln -s /var/www/html/storage/app/public /var/www/html/public/storage

    – BootDev

    15. Juli um 10:27 Uhr


Ich bin gerade auf dieses Problem gestoßen, und so habe ich es behoben, ohne dass SSH auf den Server zugreifen oder ein CronJob ausgeführt werden musste:

Zum Laravel 5+ (Nicht mit niedrigerer Version getestet)

Sie dürfen verwenden Artisan::call() Methode in Ihrem Route/Controller, um handwerkliche Befehle auszuführen, ohne das Terminal zu verwenden.

$exitCode = Artisan::call('storage:link', [] );
echo $exitCode; // 0 exit code for no errors.

  • Sie haben mein Projekt gerettet, Männer. Danke

    – KirtJ

    17. Juni 2020 um 17:35 Uhr


Ich weiß, es ist ein alter Thread, aber wir können ihn durch eine kleine Änderung in Config/filesystem.php ändern

Ersetzen

'links' => [
        public_path('/storage') => storage_path('app/public'),
    ],

mit

'links' => [
        base_path('/public_html/storage') => storage_path('app/public'),
    ],

Geben Sie hier die Bildbeschreibung ein

Sie können dieses Repository überprüfen. Ich habe darin bereits umgesetzt
https://github.com/ali-chaudhry/Laravel-7-Boilerplate-with-Spatie-uuid-Unishrp-filemanager-integeration

GELÖST

Danke für all eure Hilfenversuchte ich zu laufen php artisan storage:link auf meinem Server und ich habe herausgefunden, dass mein Server deaktiviert ist symlink aus Sicherheitsgründen.

Also habe ich alle meine Bild-Upload-Funktionen geändert, um Bilder in meine hochzuladen public Ordner statt storage Ordner und jetzt funktioniert alles einwandfrei.

  • Das Hochladen in die Öffentlichkeit wird nicht empfohlen und entspricht nicht der Laravel-Standardkonvention.

    – ein Hauch

    14. Oktober 2020 um 12:48 Uhr

  • Das öffentliche Hochladen von @ahinkle ist überhaupt kein Problem, wenn Sie darauf hinweisen, dass andere Ihre Assets in ihre URLs laden können und Ihre Quellen verwenden, können Sie den Zugriff auf Assets von anderen Quellen mit Ihrem Code oder entweder mit Hilfe des Cloudflare-Link-Schutzes jederzeit einschränken .

    – mafortis

    14. Oktober 2020 um 12:50 Uhr

  • “Speicher” gibt es aus einem bestimmten Grund. Es ist das Laravel-Speichersystem. Gegeben, warum die andere Antwort mehr Upvotes hat als Ihre ausgewählte Antwort.

    – ein Hauch

    14. Oktober 2020 um 12:52 Uhr

  • Ja, nun, es hängt von Hosting-/Serverbeschränkungen ab, die wir auch verwenden, nicht alles in unseren Händen + niemand sucht nach positiven Stimmen, wir sind hier, um Lösungen zu finden. viel Glück

    – mafortis

    14. Oktober 2020 um 12:59 Uhr

  • @ahinkle Was schlagen Sie vor, wenn wir aus irgendeinem Grund keine Symlinks verwenden können?

    – Lamar

    12. Januar 2021 um 6:56 Uhr

Benutzeravatar von ivqonsanada
ivqonsanada

Was ich getan habe, um dieses Problem zu lösen:

  1. Gehen Sie mit ssh in den Projektordner
  2. Wenn kein öffentlicher Ordner vorhanden ist, erstellen Sie ihn. Wenn Sie bereits erstellt wurden, stellen Sie sicher, dass der Speicher-Symlink, den Sie in der Entwicklung erstellt haben, gelöscht wurde.
  3. tun php artisan storage:link
  4. Verschieben Sie den erstellten symbolischen Speicherlink in den Ordner public_html
  5. erledigt.

  • Das Hochladen in die Öffentlichkeit wird nicht empfohlen und entspricht nicht der Laravel-Standardkonvention.

    – ein Hauch

    14. Oktober 2020 um 12:48 Uhr

  • Das öffentliche Hochladen von @ahinkle ist überhaupt kein Problem, wenn Sie darauf hinweisen, dass andere Ihre Assets in ihre URLs laden können und Ihre Quellen verwenden, können Sie den Zugriff auf Assets von anderen Quellen mit Ihrem Code oder entweder mit Hilfe des Cloudflare-Link-Schutzes jederzeit einschränken .

    – mafortis

    14. Oktober 2020 um 12:50 Uhr

  • “Speicher” gibt es aus einem bestimmten Grund. Es ist das Laravel-Speichersystem. Gegeben, warum die andere Antwort mehr Upvotes hat als Ihre ausgewählte Antwort.

    – ein Hauch

    14. Oktober 2020 um 12:52 Uhr

  • Ja, nun, es hängt von Hosting-/Serverbeschränkungen ab, die wir auch verwenden, nicht alles in unseren Händen + niemand sucht nach positiven Stimmen, wir sind hier, um Lösungen zu finden. viel Glück

    – mafortis

    14. Oktober 2020 um 12:59 Uhr

  • @ahinkle Was schlagen Sie vor, wenn wir aus irgendeinem Grund keine Symlinks verwenden können?

    – Lamar

    12. Januar 2021 um 6:56 Uhr

Ändern Sie die storage_path-Einstellungen durch public_path

'public' => [
  'driver' => 'local',
  'root' => public_path('app/public_html/'),
  'url' => env('APP_URL').'/storage',
  'visibility' => 'public',
],

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename="page" . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = public_path('app/public_html/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

Wenn das nicht funktioniert, können Sie versuchen:

$path = base_path().'/../public_html/images'; 

  • Ist dies dasselbe /public-Verzeichnis, in dem Sie Ihre Assets abgelegt haben, oder ist es nur ein magischer Ordner in /storage?

    – Lamar

    12. Januar 2021 um 7:22 Uhr

1405140cookie-checkDer Laravel-Speicherlink funktioniert nicht in der Produktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy