Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Typ MIME - zapisywać czy sprawdzać w locie?
croc
post 3.12.2011, 16:06:05
Post #1





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Witajcie,

czy w systemach z uploadowaniem plików lepiej jest zapisywać typ mime pliku obok nazwy w bazie czy wystarczy zapisać jego nazwę? Jak ciężka jest operacja sprawdzania typu pliku?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post 3.12.2011, 16:34:24
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Przechowywanie tego w praktyce niczego Cię nie kosztuje, więc co Ci szkodzi trzymać to w bazie. A nóż przyjdzie potrzeba jakiegoś wyszukiwania czy katalogowania. Wtedy to już będzie znacząca różnica.
Go to the top of the page
+Quote Post
croc
post 3.12.2011, 17:29:40
Post #3





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Prosiłbym jednak o odpowiedź na pytanie o wydajność. Katalogowania nie potrzebuję, a zapisywanie tego to jakby nie było redundancja danych. Nie wiem czy odczytywanie typu mime analizuje treść pliku czy tylko odczytuje nagłówki.

Ten post edytował croc 3.12.2011, 17:29:52
Go to the top of the page
+Quote Post
Crozin
post 3.12.2011, 20:22:43
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Czy jest to nadmiarowość danych? W pewnym sensie tak, bo niby da się to odczytać z samego pliku, ale koszt tej nadmiarowości jest zerowy, a potencjalnie może w przyszłości zaoszczędzić sporo problemów. Jeżeli chodzi o prędkość to odczytanie tego "z pliku" najprawdopodobniej będzie bardziej obciążające niż odczytanie z bazy danych.
Ogólnie operacje na plikach są jedynymi z wolniejszych. Baza danych co prawda też będzie musiała najprawdopodobniej takie operacje wykonywać, ale będzie to robić niekwestionowanie szybciej niż system plików. Z tego co kojarzę programy typu file próbują dopasować zawartość plików do pewnych wzorców, i tak np. PNG rozpozna na podstawie istnienia bajtów 89 50 4E 47 0D 0A 1A 0A na samym początku pliku - chociaż prawdę powiedziawszy nie jestem pewien sposobu funkcjonowania tego programu, a źródeł przeglądać mi się nie chce.

Podsumowując: takie informacje jak typ MIME czy wielkość pliku trzymałbym w bazie danych. Praktycznie nic to nie kosztuje, a całkiem możliwe, że takie podstawowe informacje mogą być bardzo użyteczne w niedalekiej przyszłości.
Go to the top of the page
+Quote Post
Pilsener
post 3.12.2011, 20:51:49
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Cytat
lepiej jest zapisywać typ mime pliku obok nazwy w bazie czy wystarczy zapisać jego nazwę?
- najlepiej jest zapisywać wszystkie przydatne informacje, które deklaruje użytkownik wysyłając plik a w szczególności nazwę, typ pliku, rozszerzenie i wszystko to co jest niezbędne podczas wysyłania pliku z powrotem do użytkownika lub jest w jakiś sposób przydatne dla nas. Jest to potrzebne po to, że gdy komuś uda się przemycić plik .php deklarując jego typ jako .png to gdy spróbuje go pobrać to mu go wysyłasz jako .png (najlepiej jeszcze pod nazwą jaką go wysłał) i masz go gdzieś.

Cytat
Jak ciężka jest operacja sprawdzania typu pliku?
- na tyle ciężka, że "w locie" lepiej tego nie robić. Crozin dobrze pisze, chociaż sam dostęp do plików jest szybki to operacje na nich są bardziej skomplikowane i zasobożerne niż na bazie.

Najlepiej jest robić tak:
1. Odbieramy plik od użytkownika i wstępnie go walidujemy (deklarowany typ MIME, rozmiar itp.)
2. Tworzymy rekord w bazie danych
3. Zapisujemy plik w docelowej lokalizacji pod nazwą = ID w bazie (wygoda i szybkość), jednak POZA http (czyli powyżej katalogu public tak, że gdy ktoś wpisze adres do pliku typu http://strona.pl/folder/plik.jpg to pomimo poprawnej ścieżki nic się nie stanie)
4. Walidujemy plik dokładniej sprawdzając go na dysku, używamy np: http://www.php.net/manual/pl/function.finfo-file.php
5. Jeśli wszystko OK to zapisujemy w bazie informacje o pliku
6. Jeśli użytkownik chce zassać plik to pobieramy go i mu wysyłamy z odpowiednimi nagłówkami, które generujemy na podstawie informacji zapisanych w bazie
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 21:44