Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Prosta klasa uploadu plików [nowa wersja], php5
cckoles
post 29.05.2008, 11:39:58
Post #1





Grupa: Zarejestrowani
Postów: 37
Pomógł: 1
Dołączył: 2.05.2007

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


Witam,

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:

  1. <?php
  2. class Upload{
  3.  
  4. public $name_file;
  5. public $name;
  6. public $type;
  7. public $size; 
  8. public $tmp; 
  9. public $message;
  10.  
  11. public function Save($file_user, $upload_dir, $typ = array(), $rename = null, $prefix = null )
  12. {
  13. if (isset($_FILES[$file_user]['name'])){
  14. $uploadErrors = array(
  15. UPLOAD_ERR_OK => 'Plik został poprawnie załadowany.',
  16.  UPLOAD_ERR_INI_SIZE  => 'Rozmiar pliku jest za duży. Ograniczenie na serwerze.',
  17. UPLOAD_ERR_FORM_SIZE  => 'Rozmiar pliku jest za duży.',
  18. UPLOAD_ERR_PARTIAL => 'Plik tylko częściowo załadowany.',
  19. UPLOAD_ERR_NO_FILE => 'Brak pliku do załadowania.',
  20. UPLOAD_ERR_NO_TMP_DIR => 'Brak tymczasowego folderu tmp !',
  21. UPLOAD_ERR_CANT_WRITE => 'Nie można zapisać pliku na dysk.'
  22. /* wymaga php 5.2.0
  23. UPLOAD_ERR_EXTENSION => 'File upload stopped by extension.' */
  24. );
  25.  
  26. $this->name  = $_FILES[$file_user]['name'];
  27. $this->type = $_FILES[$file_user]['type'];
  28. $this->size  = $_FILES[$file_user]['size'];
  29. $this->tmp = $_FILES[$file_user]['tmp_name'];
  30. $this->message = $uploadErrors[$_FILES[$file_user]['error']];
  31.  
  32. $uploadfile = $upload_dir . basename($_FILES[$file_user]['name']);
  33.  
  34. if ($_FILES[$file_user]['error'] == 0){
  35. $this->type = explode('/',$this->type);
  36. // zamiana rozszerzen w przypadku uploadu w IE
  37. $replace_prefix = array('pjpeg','x-png');
  38. $new_prefix  = array('jpeg','png');
  39. $new_type = str_replace($replace_prefix, $new_prefix , $this->type[1]);
  40. if (in_array($new_type, $typ)){
  41. // jesli parametr zmiany nazwy jest nie ustawiony rename = null
  42. if($rename == null){
  43. if (file_exists($uploadfile)){
  44. $this->message = 'Plik o nazwie '.$_FILES[$file_user]['name'].' już istnieje. Zmień nazwę pliku i załaduj ponownie.';
  45. return false;
  46. }else{
  47. if (move_uploaded_file($_FILES[$file_user]['tmp_name'], $uploadfile)){
  48. $this->message = 'Plik został załadowany pomyślnie';
  49. $this->name_file = $this->name;
  50. return true;
  51. }else{
  52. $this->message = 'Błąd ładowania pliku';
  53. return false;
  54. }
  55. }
  56. }
  57. if($rename != null){
  58. if (move_uploaded_file($_FILES[$file_user]['tmp_name'], $uploadfile)){
  59. $this->message = 'Plik został załadowany pomyślnie';
  60. $ip = $_SERVER['REMOTE_ADDR'];
  61. $new_name = md5($ip . date('YmdHis'));
  62. if(rename($uploadfile, $upload_dir . $prefix. $new_name .'.'. $new_type)){
  63. $this->name_file = $prefix . $new_name . '.' . $new_type;
  64. return true;
  65. }else{
  66. $this->message = 'Nie można zmienić nazwy pliku.';
  67. return false;
  68. }
  69. return true;
  70. }else{
  71. $this->message = 'Błąd ładowania pliku';
  72. return false;
  73. }
  74. }
  75. }else{
  76. $this->message = 'Błąd, nie obsługiwany format pliku.';
  77. return false;
  78. }
  79. }else{
  80. $this->message;
  81. return false;
  82. }
  83. }else{
  84. $this->message = 'Błędny parametr "name".';
  85. return false;
  86. }
  87. }
  88. }
  89. ?>


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:

  1. <?php
  2. // przyklad z automatyczna zmiana nazwy pliku 
  3. $plik = $_POST['plik'];
  4. $id  = 1
  5.  
  6. $upload = new Upload();
  7. $image = array('jpeg','jpg','png','gif');
  8. $upload->Save('plik','./upload/zdjecia/', $image, 1,$id);
  9.  
  10. echo $upload->message; // zwraca wszystkie komunikaty w tym bledy
  11. echo $upload->file_name; // zwraca nazwę pliku
  12.  
  13. // przyklad bez zmieniania nazwy pliku. 
  14. $plik = $_POST['plik'];
  15.  
  16. $upload = new Upload();
  17. $image = array('jpeg','jpg','png','gif');
  18. $upload->Save('plik','./upload/zdjecia/', $image);
  19.  
  20. echo $upload->message;
  21. echo $upload->file_name; 
  22. ?>


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

Ten post edytował cckoles 29.05.2008, 15:31:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
nospor
post 29.05.2008, 11:48:06
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jesli zapoda sie nazwe, ktora nie istnieje, to poleci masa noticow a od Ciebie komunikat:
Cytat
Błąd, nie obsługiwany format pliku.
No cos nie tak winksmiley.jpg


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Cysiaczek
post 29.05.2008, 11:52:13
Post #3





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@nospor - Ty to każdemu umiesz to wytknąć biggrin.gif

@autor - Powiedz mi, po co to jest klasa? Dlaczego nie funkcja? Co Ci daje to, że tworzysz obiekt tej klasy?

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
nospor
post 29.05.2008, 12:15:16
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Cysiaczek no co, musze sie na kims wyzyc winksmiley.jpg

Z innych popierdół to Save powinno zwracac true lub false, a u CIebie nie ma nic. Wiem, ze jest $error, ale Save powinno to mieć tez w sobie

edit:
$this->error = 'Plik został załadowany';
No jesli to jest error... winksmiley.jpg

edit: rozkrecam sie na dobre:
1) rename($uploadfile, $upolad_dir . $prefix. $new_name .'.'. $this->type[1]);
rename tez moze zwrocic blad
2) No dobra, zrobilo mi rename i... ups, a jak mam pobrac plik co mi go zrobil rename? Przeciez nie znam jego nowej nazwy
3) Proponuje zrobic upload pliku jpg z rename najpierw w IE a potem np. w FF. A nastepnie przyjrzec sie nazwom plikow. Jakies wnioski?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
cckoles
post 29.05.2008, 12:29:24
Post #5





Grupa: Zarejestrowani
Postów: 37
Pomógł: 1
Dołączył: 2.05.2007

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


Cytat(Cysiaczek @ 29.05.2008, 12:52:13 ) *
@nospor - Ty to każdemu umiesz to wytknąć biggrin.gif

@autor - Powiedz mi, po co to jest klasa? Dlaczego nie funkcja? Co Ci daje to, że tworzysz obiekt tej klasy?

Pozdrawiam.


Klasa dlatego ze pisze we frameworku zend. Co do nospora to spokojnie, niech sie wyzyje, ma racje więc dobrze ze napisal. On juz wie dlaczego tak dokladnie sprawdzil akurat moja klase hehe.

nospor ma racje co do IE, nie wzialem pod uwage tej pseudo przegladarki. Niebawem bedzie update .
Go to the top of the page
+Quote Post
Cysiaczek
post 29.05.2008, 15:48:23
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Ale... co ma pisanie w ZF do tego, że to jest bez sensu? Nie chcę znów wpadać w histeryczno-obiektowy ton, ale zrobienie z tego klasy to jak zakup budki z hot-dogami, żeby zjeść jednego. Zrób chociaż jakąś obsługę błędów, dodaj osobne metody zamiast argumentów - inaczej mówiąc zrób interfejs. smile.gif

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
cckoles
post 29.05.2008, 16:01:39
Post #7





Grupa: Zarejestrowani
Postów: 37
Pomógł: 1
Dołączył: 2.05.2007

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


Cytat(Cysiaczek @ 29.05.2008, 16:48:23 ) *
Ale... co ma pisanie w ZF do tego, że to jest bez sensu? Nie chcę znów wpadać w histeryczno-obiektowy ton, ale zrobienie z tego klasy to jak zakup budki z hot-dogami, żeby zjeść jednego. Zrób chociaż jakąś obsługę błędów, dodaj osobne metody zamiast argumentów - inaczej mówiąc zrób interfejs. smile.gif

Pozdrawiam.



Nie ma powodu do wpadania w histerie winksmiley.jpg Przy okazji patrzac na linki w twoim podpisie rozumiem czemu mnie ganiasz zeby dorzucic reszte zamiast samej klasy winksmiley.jpg
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: 14.08.2025 - 04:53