Laravel 9 Fille z zapisem do bazy danych blob sqlite

Laravel 9 Fille

Pierwszą chyba podstawową zaletą stosowania Laravel 9 Fille jest to, że mamy wszystkie pliki zapisane w bazie danych sqlite, co jest dość istotne z punktu widzenia danych, które nie powinny wyjść poza stronę. Laravel jest tak dobrze (ciekawie) skonstruowany, że bardzo prosto odseparować pliki, które mają wychodzić na zewnątrz od tych, które mają pozostać niewidoczne.

Wady i zalety

Właśnie dla takich zadań posłużymy się bazą danych sqlite, która w tym  przypadku sprawdzi się doskonale. Umieścimy ją powiedzmy w folderze  database i już mamy ją odciętą od świata zewnętrznego, a dostęp mamy tylko wewnątrz programy i dlatego pliki umieszczone w takiej bazie są bezpieczne. Oczywiście jeżeli bardzo nam zależy na bezpieczeństwie to zawsze możemy owe dane w tej bazie danych sqlite zaszyfrować Laravel daje w wersji podstawowej takie narzędzie jest nim Crypt::. Ja jak na razie nie będę ich szyfrował, a zapisze je dodatkowo w kodowaniu base64 ułatwi to ich odczyt w samej aplikacji. Następną zaletą takiego rozwiązania jest to zakładając, że nie chcemy aby linki wydostawały się poza naszą stronę i nie było możliwości linkowania do tych obrazków z zewnątrz sam zapis ich w linku. Będzie on wyglądał mniej więcej tak:

„data:image/jpeg;base64,

EJkv0Jk9HO8WJiPUIssICAwGf4FWCRhPX6ZkyQAAAAASUVORK5CYII=”

Odczyt takiego pliku z zewnątrz na pewno jest utrudniony i wydaje się całkiem bezpieczny w codziennym stosowaniu. Wady, dla mnie to raczej nie są wady, a system do czego chcę go wykorzystać i dla czego. Może się okazać, że z jakiś tam powodów potrzebujemy mieć pliki zapisane na serwerze w tym przypadku mija się to z celem zapisywania wszystkich plików w bazie danych sqlite ponieważ i tak będziemy musieli je zapisać w formie pliku na serwerze.

W takim przypadku od razu zapisujemy je w danej lokalizacji, a tylko sam link zapisujemy w bazie danych sqlite odciąża to samą bazę bo w tym przypadku mniej danych się w niej znajduje ale mamy więcej plików do zabezpieczenia przed ewentualnym wyciekiem danych. Więc jeżeli nie potrzebujesz mieć ciągle plików na serwerze to lepiej je trzymać w bazie danych i używać tylko wtedy kiedy są potrzebne w szczególności, jak to są pliki które zawierają dane osobowe.

Połączenie z sqlite

W celu nawiązania połączenie edytujemy plik .env usuwamy dane połączenia mysql i zapisujemy nowe z połączeniem sqlite. Pomijamy przy tym samą nazwę połączenia jak i hasło. Zamiast tego wskazujemy na ścieżkę gdzie znajduje się nasz plik bazy danych sqlite i to wszystko.

DB_CONNECTION=sqlite

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=C:/xampp8/htdocs/Kadry/database/kadry.sqlite

Blob sqlite z Eloquent ORM

Zaczniemy od przygotowania modelu, kontrolera i migracji  w konsoli cmd za jednym zamachem z tym, że ostatni parametr „r” oznacza operacje

1
index(), create(), store(), show(), edit(), update(), destroy()
. Otwieramy konsole naszego projektu podajemy odpowiednią komendę artisan czyli „php artisan make:model File -mcr” i mamy utworzone wcześniej wymienione rzeczy.

Konsola Cmd Laravel File
Konsola Cmd Laravel File

Migracja Laravel

Teraz przechodzimy do naszej migracji odszukujemy nasz plik wypisany powyżej czyli „2022_07_31_080530_create_files_table” i dopisujemy w nim odpowiednie pola tabeli w bazie danych. Zaczniemy od $table->id(); który powinien standardowo znajdować się już w pliku i do tego drugi

$table->timestamps(); odpowiedzialny za zapis daty i czasu, ja do tego dopiszę  nazwę pliku 

$table->string(’baseName’);

Tytuł czyli tu możemy zamieszczać jakieś parametr dla selektora „alt” ułatwi nam to późniejsze pozycjonowanie tej części strony $table->text(’title’);

Mime type wskazujemy rodzaj pliku jaki umieścimy w bazie danych przyda się w późniejszym etapie programowania jeżeli nie wszystkie pliki będziemy chcieli wyświetlać jako obrazki, a chcemy zapisywać do bazy danych wszystkie rodzaje plików nie tylko obrazki. $table->string(’mimeType’);

 I teraz miejsce dla naszych plików ustawiamy pole binarne i w takiej formie będziemy je zapisywać do bazy danych sqlite, ułatwi to je odczytywanie w późniejszej fazie działania kodu nie będziemy musieli ich zapisywać na serwerze co przyśpieszy działanie programu. Pliki będą bezpośrednio wczytywane do samego programu z pominięciem operacji zapisu. $table->binary(’blobSrc’);  

Oczywiście dopiszemy jeszcze rozmiar takiego pliku, choć nie musimy, lecz ułatwi to nam przegląd ilości danych jakie są zapisane w bazie danych sqlite możemy je łatwo dodać do siebie i odczytać jaką faktycznie wielkość posiadają np. w MB.   $table->string(’size’);

Jeżeli już mamy przygotowany plik migracji przeprowadzamy migrację w konsoli.

Migracja Laravel
Migracja Laravel

Widok Laravel

Z racji tego że już wcześniej przygotowałem całą stronę nie będę zanudzał szczegółami musisz tylko pamiętać, że jest to standardowa strona Laravel 9 z dołączonym systemem logowanie, którego nie będę używał na potrzeby tego poradnika uważam że jest zbędny w tym przypadku. Moja wiedza którą chcę przekazać nie wymaga tego systemu zobaczysz sam.  Na początek tworzymy plik blade w views folder file i pliku form.

Folder widok Laravel
Folder widok Laravel

Już w samym pliku odnosimy się do strony przewodniej, którą jest w moim przypadku @extends(’layouts.app’)

Następnie na potrzeby mojej strony zrobiłem nawigację gdzie obecnie user się znajduje @section(’navigation’)

Nawigacja fille Laravel
Nawigacja fille Laravel

A na koniec tego widok button oraz formularza bootstrap modle. Użyję też ikonę dołączonych do bootstrapa aby uzyskać ładny wygląd wizualny samego buttona.

Laravel bootstrap modal
Laravel bootstrap modal
Laravel dodaj File
Laravel dodaj File
Laravel dodaj modal
Laravel dodaj modal

Trzeba także pamiętać o dodaniu sesji dla informacji zwrotnych pochodzących z samego kontrolera, są umieszczone w sekcji @section(’content’)

Laravel session error
Laravel session error

A tutaj całość:

Laravel widok All
Laravel widok All

Na sam koniec jeszcze sekcja @section(’javaScript’) gdzie jest zamieszczony kod odpowiedzialny za wyświetlanie modal po wykryciu błędów.

Laravel javascript modal
Laravel javascript modal

Routes web

Tu standardowo odnosimy się do jakiejś ścieżki gdzie będziemy obsługiwać nasz kontroler ja stworzyłem dwie ścieżki jedna get index druga post store, które będą odpowiednio obsługiwać ruch pomiędzy nimi.

Laravel Route

Model File

Nie ma tu żadnej filozofii musimy tylko wskazać jakie występują pola w bazie danych tak ażeby można było wykorzystać je do połączenia Eloquent  ORM.

Przygotowujemy zmienną tablicę protected o nazwie  $fillable, a w niej wypisujemy wszystkie te pola które wcześniej zadeklarowaliśmy w migracji.

Laravel ORM
Laravel ORM

I to wszystko, przechodzimy do dalszego programowania.

Kontroler prawdę ci powie

Przygotuję wstępnie kontroler który wcześniej został utworzony, na samym początku przekierowanie do widoku naszego buttona otwierającego okno formularza wysyłającego plik do bazy będzie to w metodzie index().

Laravel kontroler
Laravel kontroler

Następnie  metoda store(Request $request), która będzie wychwytywała dane przychodzące z formularza przesłane metodą POST i zwracała wynik tego działania powodzenia lub błędu.  Sama walidacja jest stosunkowo prosta nie ma co tu się rozwodzić, zabezpieczenie przed pustą wartością do tego min, max znaków dla title i max size dla pliku na 4 MB to w zasadzie wystarczy, reszta będzie dalej zabezpieczona już poza standardową walidacją.

Laravel Validate
Laravel Validate
Laravel validate modal
Laravel validate modal

Teraz przejdźmy do dalszego etapu czyli odbierzemy zawartość przesłaną przez request i umieścimy jego zawartość do zmiennej file

Laravel File request
Laravel File request

Jeżeli mamy już swoją zmienną z zawartością pliku to możemy ją teraz rozprowadzić do odpowiednich zmiennych pierwszą z nich będzie path tam zapiszemy nasz plik tymczasowy aby można go było wgrać do bazy danych sqlite, robimy to dzięki funkcji Laravel $request->file->storeAs(). Pierwszy parametr odpowiada gdzie mamy zapisać plik tzw. Ścieżka zapisu, a drugi parametr odpowiada za nazwę pliku zapisu w ścieżce przyjmując nazwę z samego pliku $file->getClientOriginalName() poprzedzoną czasem time() .

Zapobiega to podmianie pliku na inny o tej samej nazwie i to w zasadzie tyle, plik powinien się zapisać. Przypomnę tylko, że domyślną ścieżką zapisu dla tego typu ścieżki jest folder „\storage\app\public\” . Mamy więc zapisany plik i teraz ażeby się do niego dostać do całej zawartości użyjemy

use Illuminate\Support\Facades\Storage;

czyli

Storage::path($path);

Laravel storeAs path
Laravel storeAs path

I dopiero teraz mamy gotową zawartość zapisaną i odczytaną do zmiennej $path. Wystarczy teraz przygotowaną zawartość odczytać i zakodować do base64 poprzez funkcję PHP base64_encode();

Laravel base64
Laravel base64

Po wszystkich tych operacjach na zmiennych i funkcjach mamy przygotowaną zmienną do zapisu do bazy danych sqlite. Kolejnym krokiem jest sam  zapis do bazy danych wykorzystując system Laravel Eloquent ORM zatrudnimy do tego model wcześniej przygotowany.

Laravel save file
Laravel save file

I na zakończenie pozostaje nam sprawdzić czy zapis do bazy danych został poprawnie wykonany i usunięcie pliku z serwera.

Laravel unlink save All
Laravel unlink save All
Laravel Save All sukcess
Laravel Save All sukcess

Odczyt z bazy danych

Odczytujemy zawartość z bazy danych i nie zapisujemy obrazka na serwerze tylko od razu przechodzimy do widoku i tam go wyświetlamy. Przygotujemy na początek router dla tego widoku.

Route view Image
Route view Image

Następnie otwieramy kontroler FileController i dopisujemy kawałek kodu dla metody show. Wybieramy miejsce (widok) gdzie przekażemy parametry z modelu i wysyłamy je za pomocą compact(). Zauważmy przy tym, że model przekazujemy w parametrze do metody jakby z automatu, a potem dodajemy tylko same paginate.

Laravel Kontroler Show
Laravel Kontroler Show

Teraz przechodzimy do wskazanego widoku i odczytujemy je do wcześniej przygotowanej tabeli z potrzebnymi danymi.

Laravel Widok image Base64
Laravel Widok image Base64
Laravel widok Image
Laravel widok Image

Widok bazy danych:

Baza Danych sqlite
Baza Danych sqlite

W tym artykule przeczytasz:

Githab Download

laravel 9 fille

Bootstrap 5 modal

W następnej części pokarzę wam jak zrobić Archiwum .zip z plików zapisanych w bazie danych sqlite.

Add a Comment