Ścieżka do pliku zapisanego w bazie danych

0

Witam. Poprzez formatkę zapisuję sobie obrazki w bazie:

welcome.blade.php

<div class="custom-file">
  <input type="file" name="cover" class="custom-file-input{{ $errors->has('cover') ? ' is-invalid' : '' }}">
  <label class="custom-file-label">Wybierz obraz</label>
  @if ($errors->has('cover'))
  <div class="invalid-feedback">
      <strong>{{ $errors->first('cover') }}</strong>
  </div>
  @endif
</div>

Mam pole w tabeli:

    public function up()
    {
        Schema::create('scholarships', function (Blueprint $table) {
            $table->increments('id');
            $table->string('imgcover');
            $table->timestamps();
        });
    }

Zapisuję w bazie:
ScholarshipsController.php

public function store (Request $request)
    {
    	$request->validate([
            'cover' => 'required|image'
        ]);

        $movie = Scholarship::create([
            'imgcover' => $request->file('cover')->store('covers')
        ]);

        return redirect()->route('home');
    }

I próbuję (co jest głównym celem) wyświetlić zapisane obrazy i pobrać je za pomocą linku:
welcome.blade.php

    @foreach ($scholarships as $scholarship)
    	{{ $scholarship->imgcover }}
    	<img class="card-img-top" src="storage/app/{{ $scholarship->imgcover }}" alt="alt">
    	 <a href="/storage/app/{{ $scholarship->imgcover }}" download> POBIERZ </a>
    	 <a href="/app/{{ $scholarship->imgcover }}" download> POBIERZ 2 </a>
    	 <a href="/{{ $scholarship->imgcover }}" download> POBIERZ 3 </a>
    @endforeach

Jak widzicie próbuję różnych ścieżek, ale cały czas obrazy ani nie chcą się wyświetlić, ani linki do pobrania nie działają. Obrazy zapisują się poprawnie w /storage/app/covers, w bazie w polu $scholarship->imgcover zapisują się nazwy obrazów (typu nXnE3bsnrpPQtt9QoXLDWCJiM8DEdZdCz3sGNoKm.png), więc ścieżka powinna wyglądać następująco: /storage/app/covers/nXnE3bsnrpPQtt9QoXLDWCJiM8DEdZdCz3sGNoKm.png. Próbuję ją różnie ująć jak wyżej, ale ciągle nic.

0

więc ścieżka powinna wyglądać następująco: (...)

Gdzie to przeczytałaś?

0
Patryk27 napisał(a):

więc ścieżka powinna wyglądać następująco: (...)

Gdzie to przeczytałaś?

Nigdzie, na logikę tak wychodzi, bo tam właśnie zapisują się pliki.

1

Pliki zapisują się w /katalog-twojej-aplikacji/storage, podczas gdy serwer wskazuje na /katalog-twojej-aplikacji/public (tam dopiero masz index.php) - więc na logikę zależy jak spojrzysz ;-)

  1. Odpal php artisan storage:link - to spowoduje utworzenie symlinka z storage/app/public do public/storage.
  2. Wszystkie publiczne pliki wrzucaj do storage/app/public.
  3. Profit!

https://www.5balloons.info/upload-profile-picture-avatar-laravel-5-authentication/

0
Patryk27 napisał(a):

Pliki zapisują się w /katalog-twojej-aplikacji/storage, podczas gdy serwer wskazuje na /katalog-twojej-aplikacji/public (tam dopiero masz index.php) - więc na logikę zależy jak spojrzysz ;-)

  1. Odpal php artisan storage:link - to spowoduje utworzenie symlinka z storage/app/public do public/storage.
  2. Wszystkie publiczne pliki wrzucaj do storage/app/public.
  3. Profit!

https://www.5balloons.info/upload-profile-picture-avatar-laravel-5-authentication/

Ad. 1: odpaliłam, zadziałało.
Ad. 2: Zmieniłam 'imgcover' => $request->file('cover')->store('covers') na 'imgcover' => $request->file('cover')->store('public') i też zadziałało, pliki teraz zapisują się w storage/app/public.

{{ $scholarship->imgcover }} wypisuje się jako public/xGRmbfB3yCTkxC83ViHddufAWp90hZPuOekCb70h.jpeg, ok.

Więc ta ścieżka: <img class="card-img-top" src="storage/app/{{ $scholarship->imgcover }}" alt="alt"> powinna dawać sumarycznie storage/app/public/xGRmbfB3yCTkxC83ViHddufAWp90hZPuOekCb70h.jpeg, ale obrazek się nie wyświetla.

0

Dlaczego cały czas dopisujesz ręcznie storage/app/ do src?

0
Patryk27 napisał(a):

Dlaczego cały czas dopisujesz ręcznie storage/app/ do src?

Puściłam chyba każdą możliwą opcję, bez dopisywania też, lipton :)

      <img class="card-img-top" src="storage/app/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="public/storage/app/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="/storage/app/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="/storage/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="storage/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="/public/storage/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="public/storage/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="storage/app/public/{{ $scholarship->imgcover }}" alt="alt"><br>
      <img class="card-img-top" src="/storage/app/public/{{ $scholarship->imgcover }}" alt="alt"><br>
0

Wejdź do katalogu public, odpal w terminalu find i wrzuć rezultat - być może coś poszło nie tak podczas zapisywania zdjęć przykładowo.

0
Patryk27 napisał(a):

Wejdź do katalogu public, odpal w terminalu find i wrzuć rezultat - być może coś poszło nie tak podczas zapisywania zdjęć przykładowo.

\testing\public
λ find
.
./.htaccess
./covers
./css
./css/app.css
./favicon.ico
./index.php
./js
./js/app.js
./robots.txt
./storage
./web.config
0

Powinno być tak, że fotki są w /storage/app/public, a po odpaleniu php artisan storage:link są w /public/storage/ zamiast w /public/storage/app/public? Chodzi mi o brak przejścia przez /app/.

0

bo zwykle zapisuje się w public/storage (podobnie jak css/js) z uprawnieniami do folderu, sam folder aplikacji powinien być wolny od jakiś zewnętrznych plików

0
czysteskarpety napisał(a):

bo zwykle zapisuje się w public/storage (podobnie jak css/js) z uprawnieniami do folderu, sam folder aplikacji powinien być wolny od jakiś zewnętrznych plików

Dziękuję za odpowiedź, ale to nadal nie rozwiązuje mojego problemu :(

1

a co ci pokazuje przeglądarka? jest link do pliku z nazwą i odpowiednim rozszerzeniem czy puste pole?
w bazie zapisuje prawidłowo?
spróbuj zmienić folder zapisu
poczytaj o uprawnieniach do folderu w windows jak robisz lokalnie

0
czysteskarpety napisał(a):

a co ci pokazuje przeglądarka? jest link do pliku z nazwą i odpowiednim rozszerzeniem czy puste pole?
w bazie zapisuje prawidłowo?
spróbuj zmienić folder zapisu
poczytaj o uprawnieniach do folderu w windows jak robisz lokalnie

{{ $scholarship->imgcover }} gdzie zapisuję ścieżki do obrazów wyświetla w przeglądarce (dla przykładowego pliku):
public/dvJTn9jszosfRu4jgEyFBHd6z6zT9PAF1seYLEt4.jpeg.
Wyświetlanie nie działa, pobieranie też:
Firefox nie może odnaleźć pliku http://testing.test/public/dvJTn9jszosfRu4jgEyFBHd6z6zT9PAF1seYLEt4.jpeg.
W bazie zapisuje prawidłowo. Zmieniałam folder zapisu, to samo.

1

Idąc za dokumentacją:

$url = Storage::url($scholarship->imgcover);

chociaż wydaje mi się, że powinno wystarczyć:

{{ asset($scholarship->imgcover) }}
0
arczinosek napisał(a):

Idąc za dokumentacją:

$url = Storage::url($scholarship->imgcover);

chociaż wydaje mi się, że powinno wystarczyć:

{{ asset($scholarship->imgcover) }}

Szanowni panowie - DZIAŁA :) konkretnie {{ Storage::url($scholarship->imgcover) }}

@arczinosek dziękuję najbardziej na świecie!

0

ale to dziwne, że z poprzednich żadna nie działała, ew. możesz sobie sprawdzić taką metodę z https://laravel.com/docs/5.7/filesystem
w części The Public Disk:

The public disk is intended for files that are going to be publicly accessible. By default, the public disk uses the local driver and stores these files in storage/app/public. To make them accessible from the web, you should create a symbolic link from public/storage to storage/app/public. This convention will keep your publicly accessible files in one directory that can be easily shared across deployments when using zero down-time deployment systems like Envoyer.

To create the symbolic link, you may use the storage:link Artisan command:

php artisan storage:link

Of course, once a file has been stored and the symbolic link has been created, you can create a URL to the files using the asset helper:

echo asset('storage/file.txt');

1 użytkowników online, w tym zalogowanych: 0, gości: 1