![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 3 Dołączył: 29.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Niedawno miałem za zadanie napisać mały panel administracyjny dla pewnej szkoły. Panel ten miał posiadać m. in. możliwość uploadu plików na serwer. Po krótkim zastanowieniu przyszła mi myśl napisania klasy uploadera - narzędzia do uploadowania plików. Klasa była pisana na szybko w związku z tym chciałbym poddać ją do konsultacji z wami. Zastanawiam się czego jej jeszcze brakuje, jakie posiada błędy, co można poprawić. Zaznaczam, że chciałbym jej używać także w przyszłych projektach. Przede wszystkim chodzi o bezpieczeństwo i elastyczność. Oto kod:
Jak widać klasa nie jest jeszcze ukończona i perfekcyjna, ale chciałbym się dowiedzieć czy w dobrym kierunku piszę ten kod. Może pokrótce omówię jak to powinno działać. Argumentami konstruktora są opcjonalnie ścieżka upload'u (domyślnie główny katalog), tablica zezwolonych rozszerzeń (możemy wybrać z dostępnych 'IMAGE', 'APPLICATION' itd., lub stworzyć własną $Ex = array('cokolwiek', 'cokolwiek2'); ) oraz maksymalny rozmiar przesyłanego pliku. Cały upload przedstawię za pomocą schematu: NOWY UPLOADER -> OKREŚLENIE GŁÓWNYCH PARAMETRÓW -> KONFIGURACJA TRYBÓW -> DODANIE PLIKU DO BUFORA (wielokrotne) -> UPLOAD PLIKÓW Z BUFORA Za cel stawiałem sobie możliwość dodawania dowolnej ilości plików do bufora (tzw. multiupload). Jeśli chodzi o tryby, jeszcze pozostawiłem ten moduł do dopracowania. Jak na razie dostępne są dwa tryby (nie wiem czy zbyt sensowne): - MODE_FUN (FILE_UP_NOW) - tryb z wyłączonym buforowaniem. Pliki są od razu uploadowane z wywołaniem funkcji addFile(); - MODE_FIP (FILE_IN_PATH) - tryb z uploadowaniem pliku do katalogu o nazwie pliku, np. ./katalog/katalog2/podanie_11/podanie11.php Z góry dzięki za uzasadnioną krytykę oraz uwagi. Pozdrawiam EDIT: Uaktualniłem klasę, dodałem kilka poprawek oraz nowy mod MODE_CD (CLEAR_DIRECTION), który odpowiada za czyszczenie docelowego katalogu przed uploadowaniem plików. Planuję jeszcze dorobić obsługę wyjątków, a tym samym komunikatów i błędów. Już edytując ten post zauważyłem kilka niedopatrzeń, idę je poprawiać. ;-) Ten post edytował Sagnitor 29.05.2011, 17:17:32 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 16.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Wszytko pięknie, ładnie ale czy jest się męczyć? Ja używam uploadify, całkiem nieźle się spisuje, przejrzysty, łatwo się go zespala z całością, dobrze dopracowany. http://www.uploadify.com/documentation
![]() |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 3 Dołączył: 29.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Wiesz, ja mam nadmiar wolnego czasu ;-)
Po prostu chcę stworzyć coś bezpiecznego i elastycznego, co przyda mi się w takich małych projektach. Jeśli chodzi o męczenie to może jestem odmianą jakiegoś nerda, ale mi to sprawia przyjemność i radochę. ^^ Pozdrawiam |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 568 Pomógł: 192 Dołączył: 7.03.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Po co ci ten wycinek. Gdy tworzysz obiekt klasy upload dodajesz właściwość z rozszerzeniami plików jakie możesz wysłać.
Dodatkowo jakbyś jeszcze miał możliwość sprawdzania typów mime. Zauważ, że nie masz takiego czegoś jak zwracanie błędów tudzież komunikatów. Również możesz ustawić sobie opcję, gdy będzie taki sam plik już wysłany to czy mu zmieniać automatycznie nazwę dodając do końca np _2, _3, przy wyłączonej opcji będzie go zastępować. I ważna opcja: wywalanie z nazwy plików dziwnych znaków, zostawiasz tylko litery, liczbym _ . itd. -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 3 Dołączył: 29.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za cenną poradę.
Myślałem już nad sprawdzaniem typów MIME, lecz jak wiadomo pochodzą one od użytkownika, a wszystko co otrzymujemy od użytkownika należy uważać za niebezpieczne. ;-) Czytałem o FileInfo i funkcji finfo_file(), niestety mam problem co do instalacji tego rozszerzenia PHP. Błędy i komunikaty - aktualnie nad nimi pracuję, zastanawiam się w jakiej postaci je zwracać, jednak tutaj jestem na dobrej drodze. Jestem bardzo wdzięczny za propozycje kolejnych 'trybów' uploadu, już niedługo dodam je do klasy, logiczne propozycje. Wpadł mi do głowy taki pomysł trybu, w którym katalog do którego dodawany jest plik byłby czyszczony przez skrypt (taka jakby aktualizacja). Czekam na kolejne propozycje. Pozdrawiam |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 664 Pomógł: 169 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Małe sugestie:)
1) Staraj się używać === zamiast == oraz !== zamiast !=, te pierwsze porównują również typ zmiennej 2) Usuń wszystkie wywołania funkcji echo(). Ta klasa ma służyć do uploadu plików, więc echo nie ma tam racji bytu. Zamiast tego albo wyrzucaj wyjątek (może być twój własny np. CUploader_Exception) albo zwracaj kod błędu lub false, czy co tam innego wymyślisz:) 3) Do metod config() i changeDir() możesz sobie dodać na końcu: return $this; Dzięki temu będziesz mógł zrobić tak:
zamiasta
W sumie to samo możesz zrobić w clearBuffer(). 4) addFile() mogłoby zwracać true w przypadku, gdy wszystko się udało. 5) metoda upload(): a) masz if ... elseif ..., więc może na samym końcu dodaj return false (true? exception?), bo teraz jak dojdzie do końca, a nie wejdzie do bloków instrukcji, to się nic nie stanie. ![]() 6) Dodaj sobie komentarze do metod publicznych, bo z doświadczenia wiem, że po pewnym czasie zapomina się od czego był ten cudowny parametr $FileHandle i dlaczego defaultowo jest ustawiony na zero:) 7)
Rozumiem, że tyle parametrów jest dlatego, że planujesz rozszerzyć listę ustawień ![]() Proponuje zrobić tak:
unikasz przekazywania setek parametrów, pętli for, switch'a. Dodanie kolejnej opcji, to też nie jest duża zmiana w kodzie klasy. 8) MODE_FIP i MODE_FUN powinny być pisane z małych liter. Wielkimi literami nazywa się stałe. -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 3 Dołączył: 29.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem jak Ci się odwdzięczyć,
![]() Ogromne dzięki, za pomoc w poprawie jakże istotnych spraw w klasie. Klasa jest teraz bardziej elastyczna w rozbudowie i samym użyciu. Mam tylko pewne zastrzeżenie do punktu nr 7. W owej radzie poleciłeś mi zastosowanie parametru jako tablicy, czyli tym samym konfiguracja klasy sprowadza się do tablicy:
Mam jednak pytanie i dążę do rozwiązania tego w taki sposób, aby efekt był podobny jak w funkcji wbudowanej unset(). Mam na myśli dowolną ilość podawanych zmiennych, bez wykorzystania tablicy. Chciałbym, aby konfiguracja klasy wyglądała mniej więcej tak:
Myślę, że takie rozwiązanie bardziej 'uprzyjemnia' samo korzystanie z klasy. Pozdrawiam i dziękuję za dotychczasowe odpowiedzi |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 664 Pomógł: 169 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem, czy przekazywanie do metody zbyt wielu parametrów, jest dobrym pomysłem.
Możesz dodać jedną metodę np. setMode, gdzie pierwszym parametrem byłaby nazwa trybu, a drugim - wartość (domyślnie true ![]() I wtedy zamiast:
Miałbyś:
Dodatkowo te twoje tryby to był trochę przeprojektował na zasadzie: 1) Nazwy trybów zamieniłbym na consty (wewnątrz klasy):
2) Dodałbym tablice z ustawieniami trybów:
I tak ustawienie mode_fip na true wyglądałoby:
Jeżeli oczywiście nadal chcesz przekazywać niesprecyzowaną (bo tak naprawdę nie wiesz ile trybów będziesz obsługiwał) ilość parametrów, to radzę się zainteresować funkcjami: http://php.net/manual/en/function.func-get-args.php http://www.php.net/manual/en/function.func-num-args.php Dzięki nim unikniesz modyfikacji metody config() za każdym razem, gdy zmieni się liczba dostępnych trybów. Możesz jeszcze użyć metody __call() do obsługi ustawiania trybów (setModeFip(), setModeFun(), setOtherMode(), etc.), ale osobiście staram się unikać magii w kodzie:P -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 05:41 |