Jest dużo rozbudowanych klas do upload-u plików ale ja potrzebowałem prostej która na każdym etapie ładowania pliku zwraca błąd jeśli taki wystąpi. Dodatkowo opcjonalnie można ustawić automatyczną zmianę nazwy ładowanego pliku na unikalną. Moze komus się przyda.
Zgodnie ze słusznymi uwagami nospora poprawilem klase ktora dodatkowo zwraca true, false. Poprawilem tez ladowanie pliku bez zmieniania nazwy gdzie jesli istnieje plik o tej samej nazwie zostanie zwrocony komunikat. Dodana zostala tablica zmieniajaca "type" w przypadku uploadowania w IE. Do systemu tworzacego unikalna nazwe zostalo dodane tez IP.
Kod klasy:
<?php class Upload{ public $name_file; public $name; public $type; public $size; public $tmp; public $message; { UPLOAD_ERR_OK => 'Plik został poprawnie załadowany.', UPLOAD_ERR_INI_SIZE => 'Rozmiar pliku jest za duży. Ograniczenie na serwerze.', UPLOAD_ERR_FORM_SIZE => 'Rozmiar pliku jest za duży.', UPLOAD_ERR_PARTIAL => 'Plik tylko częściowo załadowany.', UPLOAD_ERR_NO_FILE => 'Brak pliku do załadowania.', UPLOAD_ERR_NO_TMP_DIR => 'Brak tymczasowego folderu tmp !', UPLOAD_ERR_CANT_WRITE => 'Nie można zapisać pliku na dysk.' /* wymaga php 5.2.0 UPLOAD_ERR_EXTENSION => 'File upload stopped by extension.' */ ); $this->name = $_FILES[$file_user]['name']; $this->type = $_FILES[$file_user]['type']; $this->size = $_FILES[$file_user]['size']; $this->tmp = $_FILES[$file_user]['tmp_name']; $this->message = $uploadErrors[$_FILES[$file_user]['error']]; if ($_FILES[$file_user]['error'] == 0){ // zamiana rozszerzen w przypadku uploadu w IE // jesli parametr zmiany nazwy jest nie ustawiony rename = null if($rename == null){ $this->message = 'Plik o nazwie '.$_FILES[$file_user]['name'].' już istnieje. Zmień nazwę pliku i załaduj ponownie.'; return false; }else{ $this->message = 'Plik został załadowany pomyślnie'; $this->name_file = $this->name; return true; }else{ $this->message = 'Błąd ładowania pliku'; return false; } } } if($rename != null){ $this->message = 'Plik został załadowany pomyślnie'; $ip = $_SERVER['REMOTE_ADDR']; $this->name_file = $prefix . $new_name . '.' . $new_type; return true; }else{ $this->message = 'Nie można zmienić nazwy pliku.'; return false; } return true; }else{ $this->message = 'Błąd ładowania pliku'; return false; } } }else{ $this->message = 'Błąd, nie obsługiwany format pliku.'; return false; } }else{ $this->message; return false; } }else{ $this->message = 'Błędny parametr "name".'; return false; } } } ?>
Wyjaśnienie: public function Save($file_user, $upolad_dir, $typ = array(), $rename = null, $prefix = null )
$file_user = nazwa pola name w formularzu uploadu ( wymagane )(string)
$upload_dir = sciezka do katalogu gdzie ma być zapisany plik (wymagane)(string)
$typ = tablica z formatami plikow jakie akceptujemy (wymagane)(array)
$rename = jesli ustawimy na 1 bedzie automatycznie zmieniac nazwe pliku na unikalna unikalna nazwa to ip + data + czas zaszyfrowane funkcja szyfrujaca md5 , to daje nam gwarancje ze nazwa pliku bedzie unikalna i nie ma szans aby ktos petla pobral sobie nasze pliki.
$prefix = jesli ustawimy parametr rename na 1 dodatkowo mozemy opcjonalnie ustawić prefix który bedzie dodawany do nazwy pliku po załadowaniu (opcjonalnie)(string)
Przyklad zastosowania:
<?php // przyklad z automatyczna zmiana nazwy pliku $plik = $_POST['plik']; $id = 1 $upload = new Upload(); $upload->Save('plik','./upload/zdjecia/', $image, 1,$id); // przyklad bez zmieniania nazwy pliku. $plik = $_POST['plik']; $upload = new Upload(); $upload->Save('plik','./upload/zdjecia/', $image); ?>
Klasa jest prosta i mam swiadomosc ze mozna ja o wiele bardziej rozbudowac ale wlasnie oto w niej chodzilo, ma sluzyc tylko do uploadu a obrobka zdjec to juz inne klasy sie zajma.
Pozdrawiam