Zdjęcia się nie ładują pomimo dobrej ścieżki

0

Mam problem zdjęcia mi się nie ładują pomimo dobrej ścieżki, dostaje bład Failed to load resource: the server responded with a status of 404 (Not Found), a zdjęcie link ma dobry. Robiłem php artisan storage:link ale nic nie pomogło. Korzystam z dockera i wyczytałem, że gdzieś tutaj może leżeć problem, ale nie wiem gdzie szukać głębiej.

0

Pokaż konfig vhosta, infry i opisz coś więcej, bo z dockerem można zrobić kilkaset różnych konfiguracji.
Nie może zaczytać resourca bo pewnie gdzieś jest albo źle podana ścieżka, tylko nie da się tego wywróżyć z fusów :)

0
version: "3.8"

networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    ports:
      - "80:80"
    volumes:
      - .:/var/www/html
      - ./default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  mysql:
    image: mariadb:latest
    restart: unless-stopped
    tty: true
    ports:
      - "${DB_PORT}:3306"
    environment:
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USERNAME=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/html
    ports:
      - "8000:8000"
      - "5173:5173"
    networks:
      - laravel
FROM php:8.1-fpm-buster

ENV WORKDIR=${WORKDIR:-/var/www/html}
ARG NODE_VERSION=18

RUN apt-get update \
   
RUN docker-php-ext-configure gd --with-jpeg --with-freetype \
    && docker-php-ext-configure imap --with-kerberos --with-imap-ssl

RUN docker-php-ext-install \
   

RUN pecl install imagick pcov \
    
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN curl -sLS https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \

RUN set -eux; \

RUN apt-get -y clean \

COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh

WORKDIR ${WORKDIR}

ENTRYPOINT ["/entrypoint.sh"]

CMD ["php-fpm"]
server {
    listen 80;
    listen [::]:80;
    server_name localhost;
    root /var/www/html/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php server.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
0

F12 - devtoolsy jaki komunikat pokazują?

0
kbi64 napisał(a):

F12 - devtoolsy jaki komunikat pokazują?

screenshot-20230219173732.png
o to ci chodzi? czy coś innego
screenshot-20230219173851.png

0

folder storage chyba jest powyżej public jak pamiętam? Dorzuciłbym jakiegoś symlinka na ten folder bo vhost wskazuje na public

0
kbi64 napisał(a):

folder storage chyba jest powyżej public jak pamiętam? Dorzuciłbym jakiegoś symlinka na ten folder bo vhost wskazuje na public

Tak, wyżej jest, jeżeli chodzi ci o ten drugi.
screenshot-20230219175441.png

0

Wygląda ok, obstawiałbym raczej że po dopaleniu dockera ten symlink jest usunięty albo w nieprawidłowy sposób zaczytany.
Odpal docker-compose i wejdź do kontenera w którym odpalisz jeszcze raz php artisan storage:link od tego bym zaczął

0
kbi64 napisał(a):

Wygląda ok, obstawiałbym raczej że po dopaleniu dockera ten symlink jest usunięty albo w nieprawidłowy sposób zaczytany.
Odpal docker-compose i wejdź do kontenera w którym odpalisz jeszcze raz php artisan storage:link od tego bym zaczął

Już robiłem tak i nic nie pomogło docker exec -it -u www nazwa-kontenera php artisan storage:link

0

Dobra, to ostatnie co mi przychodzi do głowy to zmiana adresu z localhost na 127.0.0.1, miałem też case z tym że docker nie radził sobie z obsługą tego, możesz tez wywalić ten adres ipv6 z nginxa listen [::]:80;

Może trzeba gdzieś w routingu dopisać:
Artisan::call('storage:link');

0

Domyślnie o ile pamiętam symlink idzie pod storage/app/public i URL wtedy wygląda localhost/storage/someFileFromPublicDirectory
Spróbuj na test umieścić pliki w katalogu app/public i jak będzie działać to musisz pogrzebać w configu i dodać symlink do tego katalogu wyżej cars
Sprawdź w Config jakie masz symlinki
https://laravel.com/docs/9.x/filesystem#the-public-disk
Ostatnie to uprawnienia na katalog i pliki w tym katalogu cars nadaj na ten katalog 755 jak jest coś innego.

0
jurek1980 napisał(a):

Domyślnie o ile pamiętam symlink idzie pod storage/app/public i URL wtedy wygląda localhost/storage/someFileFromPublicDirectory
Spróbuj na test umieścić pliki w katalogu app/public i jak będzie działać to musisz pogrzebać w configu i dodać symlink do tego katalogu wyżej cars
Sprawdź w Config jakie masz symlinki
https://laravel.com/docs/9.x/filesystem#the-public-disk
Ostatnie to uprawnienia na katalog i pliki w tym katalogu cars nadaj na ten katalog 755 jak jest coś innego.

Zmieniłem, żeby zdjęcia się zapisywały do public zamiast do oddzielnego folderu i nadal nic i zmienił się błąd na
screenshot-20230219194201.png
W kontenerze z nginx jest zlinkowany.
screenshot-20230219191456.png

0

To pokaż jeszcze jak budujesz te linki i jak umieszczasz pliki w katalogu? Pliki mają nazwy jak w linkach?

0

Po dodaniu pliku w formularzu sam się wrzuca do folderu.

$car->photo = $request->file('photo')->store('public');

Tak, mają taką samą nazwę
screenshot-20230219195451.png

Jak buduje linki, co masz na myśli?

0
Raloseq napisał(a):

Jak buduje linki, co masz na myśli?

W sensie czy sklejasz je ręcznie, czy używasz jakiejś funkcji pomocniczej?
Sprawdzałeś uprawnienia do tego pliku i katalogu?

0

Te linki same się robią ja nic nie zmieniałem w domyślnej konfiguracji Laravela. Plik z przesłanego formularza ląduje w folerze storage/app/public do bazy przesyła się string lokalizacji zdjęcia w takiej postaci public/V0AkWXifX70Lj3M17VzmrlVFMDxwBOQgXnnjrk7J.png i potem wyświetlam go tak <img src="{{ asset('storage/' . $car->photo) }}" alt="">

0

Ogólnie to jak wywalę public z url to działa czyli np. localhost/storage/V0AkWXifX70Lj3M17VzmrlVFMDxwBOQgXnnjrk7J.png. Tylko w, którym miejscu dodaje mi się ten public? bo raczej
$car->photo = $request->file('photo')->store('public'); nie przez store()?

0

Nie wiem czy to dobre rozwiązanie ale musi tak zostać bo nie mam pomysłu na coś innego.
Trzeba ręcznie utworzyć symlinka w folderze public/ ln -s ../storage/app/example example w konterzene z nginexem i wtedy bazować na tym, że do bazy zapisuje się zdjęcie z public/.

2
Raloseq napisał(a):

Ogólnie to jak wywalę public z url to działa czyli np. localhost/storage/V0AkWXifX70Lj3M17VzmrlVFMDxwBOQgXnnjrk7J.png. Tylko w, którym miejscu dodaje mi się ten public? bo raczej
$car->photo = $request->file('photo')->store('public'); nie przez store()?

artisan storage:link robi Ci symlinka ze storage/app/public do public/storage czyli katalogu storage/ dostępnego z poziomu przeglądarki. W bazie trzymasz relatywną ścieżkę na użytek wewnętrzny, a nie publiczny url, więc przed przekazaniem jej do atrybutu src w htmlu musisz przepuścić ją przez funkcję asset() - https://laravel.com/docs/10.x/filesystem#the-public-disk

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