Podczas projektowania aplikacji mobilnej, której jednych z zadań jest wysłanie zdjęć na serwer powstało pytanie: w jaki (efektywny) sposób wysłać zdjęcia i je przechowywać na serwerze? Rozważymy obie wersje oraz metody przesyłania tych danych na serwer.

Studium przypadku

W aplikacji mobilnej można zrobić zdjęcia lub wybrać je z galerii z zamiarem zapisania ich na zdalny serwer. Na serwerze poprzez aplikację internetową można analizować wysłane dane z aplikacji mobilnej. Aplikacja internetowa postawiona jest na MySQL oraz udostępnia RESTowe API.

Baza danych

Przechowywanie zdjęć w bazie danych ma tę zaletę, że wszystko jest w jednym miejscu co zapewnia integralność oraz można zrobić backup całości jednym poleceniem. Dodatkowo po stronie aplikacji mobilnej upraszcza to mechanizm wysyłania zdjęć na serwer. Zdjęcia można potraktować kodowaniem Base64 i w jednej transakcji na serwerze, zapisać dane oraz zdjęcia do bazy danych. Czyli w przypadku błędów w transmisji, nie będzie tak, że część danych będzie dostępna a część nie (zależy od implementacji).

Baza “puchnie”

Zasadniczym minusem tego rozwiązania jest to, że baza danych będzie szybko “puchnąć”. Nie piszę tu o dedykowanych rozwiązaniach jak w MSSQL, lecz w przypadku MySQL gdy będziemy chcieli zrobić szybko backup bazy danych, to trochę to może potrwać (chyba, że wykluczymy odpowiednią tabelę podczas eksportu). Dodatkowo jeśli posługujemy się phpMyAdminem, nierzadko dojdzie do przekroczenia limitu czasu wykonania skryptu.

Znacznie lepszym rozwiązaniem będzie przechowywać ścieżki relatywne do odpowiedniego pliku.

Transfer danych

W przypadku przesyłania zdjęć za pomocą JSON, wystarczy zdjęcia zakodować w Base64 i przesłać całość żądaniem POST. Minusem tego rozwiązania jest jego opasłość. Kodowanie Base64 spowoduje, że zdjęcie będzie zajmować o ~33% więcej jego pierwotnego rozmiaru. W przypadku transmisji komórkowej, może mieć to istotne znaczenie. Jeśli zdjęć do wysłania będzie dużo, to rozmiar pojedynczego żądania może być naprawdę spory i ryzykujemy timeoutem.

Drugim sposobem, wymagającym już większej synchronizacji pomiędzy tym co zapiszemy do bazy danych a wyślemy na serwer, jest wysłanie zdjęć poprzez FTP. W przypadku Android, należy ściągnąć odpowiednią paczkę z Apache i za pomocą klienta FTP przesyłać po kolei zdjęcia. Po pomyślnym załadowaniu pliku na FTP, można wysłać odpowiednie żądanie JSON np. ze ścieżką do zdjęcia. Oszczędzamy transfer w porównaniu do Bas64 oraz minimalizujemy ryzyko z przeciążaniem skryptów.

Proponowane rozwiązanie

  1. Zapis podstawowych danych poprzez JSON oraz pobranie ID rekordu
  2. Zapis relatywnych ścieżek plików w bazie danych. Dodatkowa flaga w tabeli “is_uploaded”, dla oznaczenia czy zdjęcie jest już dostępne.
  3. Wysłanie zdjęć poprzez FTP. Po pomyślnym wrzuceniu danego pliku, wysłanie JSON aby ustawić flagę “is_uploaded” dla danego pliku. Jeśli transfer z przyczyn błędu transmisji się nie powiedzie, ponawiamy transmisję do skutku.
  4. W przypadku pozytywnego wgrania pliku, odhaczenie go w lokalnej bazie danych np. SQLite

Idealnym rozwiązaniem jest przechowywanie danych w lokalnej bazie SQLite i napisania odpowiedniej usługi, która cyklicznie będzie wysyłała te dane na zdalny serwer.


Podobne artykuły

Komentarze

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *