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() |
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.
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.
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’)
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.
Trzeba także pamiętać o dodaniu sesji dla informacji zwrotnych pochodzących z samego kontrolera, są umieszczone w sekcji @section(’content’)
A tutaj całość:
Na sam koniec jeszcze sekcja @section(’javaScript’) gdzie jest zamieszczony kod odpowiedzialny za wyświetlanie modal po wykryciu błędów.
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.
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.
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().
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ą.
Teraz przejdźmy do dalszego etapu czyli odbierzemy zawartość przesłaną przez request i umieścimy jego zawartość do zmiennej file
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);
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();
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.
I na zakończenie pozostaje nam sprawdzić czy zapis do bazy danych został poprawnie wykonany i usunięcie pliku z serwera.

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.
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.
Teraz przechodzimy do wskazanego widoku i odczytujemy je do wcześniej przygotowanej tabeli z potrzebnymi danymi.
Widok bazy danych:

W tym artykule przeczytasz:
- Laravel 9 Fille
- Wady i zalety zapisywania plików do bazy danych
- Połączenie z sqlite
- Blob sqlite z Eloquent ORM
- Migracja Laravel
- Widok Laravel
- Routes web
- Model File
- Kontroler prawdę ci powie
- Odczyt z bazy danych i wyświetlenie obrazka
W następnej części pokarzę wam jak zrobić Archiwum .zip z plików zapisanych w bazie danych sqlite.