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.


Strona Internetowa

Potrzebujesz Å‚adnej strony internetowej? Zobacz demo na: tej stronie strona internetowa


Podobne artykuły

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *