Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa uploadu
Forum PHP.pl > Forum > Kontrola i zarządzanie projektami
kujol
Witam, według was ta klasa ma sens co mogę w niej zmienić?

  1. <!doctype html>
  2. <html>
  3. <head>
  4.  
  5. <meta charset="UTF-8">
  6. <title>Upload pliku na serwer</title>
  7.  
  8. </head>
  9. <body>
  10.  
  11. <form method="post" action="" enctype="multipart/form-data">
  12. Max 10MB <input type="file" name="file"/>
  13. <input type="checkbox" name="mini"/> -Stwórz miniaturkę, jeśli plik jest grafiką (jpeg, png, gif)
  14. Szerokość: <input type="text" name="width" value="200"/>px
  15. Wysokość: <input type="text" name="height" value="150"/>px<br/>
  16. <input type="submit" name="submit" value="Wyślij"/>
  17. </form>
  18.  
  19. <?php
  20.  
  21. class Upload{
  22.  
  23. private $maxSize;
  24. private $catalog;
  25.  
  26. private $file;
  27. private $type;
  28. private $size;
  29. private $name;
  30. private $name_tmp;
  31. private $error;
  32.  
  33. private $width;
  34. private $height;
  35.  
  36. function wgraj(){
  37.  
  38. $this->maxSize = 10000000; //max rozmiar pliku w bajtach ~ 10 MB
  39. $this->catalog = $_SERVER['DOCUMENT_ROOT']."/TWOJ_FOLDER/"; //folder docelowy
  40.  
  41. $this->file = $_FILES['file']['name'];
  42. $this->type = $_FILES['file']['type'];
  43. $this->size = $_FILES['file']['size'];
  44. $this->name = $_FILES['file']['name'];
  45. $this->name_tmp = $_FILES['file']['tmp_name'];
  46. $this->error = $_FILES['file']['error'];
  47.  
  48. $this->width = $_POST['width'];
  49. $this->height = $_POST['height'];
  50.  
  51. $this->submit = $_POST['submit'];
  52. $this->mini = $_POST['mini'];
  53.  
  54. if (isset($this->submit)){ //sprawdza czy został wciśnięty przycisk wyslij
  55.  
  56. if(isset($this->mini)){ //sprawdza czy został wybrana opcja miniaturki
  57. //uploda + miniaturka
  58. if($this->type == "image/jpeg" OR $this->type == "image/png" OR $this->type == "image/gif"){ //dozwolone typy grafik
  59.  
  60. if ($this->size <= $this->maxSize){
  61.  
  62. if(move_uploaded_file($this->name_tmp, $this->catalog.$this->name)){ //zapisuje plik w folderze
  63. echo "Pomyślnie wgrano plik!<br/>";
  64.  
  65. if($this->type == "image/jpeg"){
  66. $this->img = imagecreatefromjpeg("$this->name"); //wybiera grafikę jpeg do zmniejszenia
  67. }
  68.  
  69. elseif($this->type == "image/png"){
  70. $this->img = imagecreatefrompng("$this->name"); //wybiera grafikę png do zmniejszenia
  71. }
  72.  
  73. else{
  74. $this->img = imagecreatefromgif("$this->name"); //wybiera grafikę gif do zmniejszenia
  75. }
  76.  
  77. $this->original_width = imagesx($this->img); //pobiera rozmiary oryginalnej grafiki
  78. $this->original_height = imagesy($this->img);
  79.  
  80. $this->img_mini = imagecreatetruecolor($this->width, $this->height); //pobiera id zdjęcia
  81.  
  82. if(imagecopyresampled($this->img_mini, $this->img, 0, 0, 0, 0, $this->width , $this->height, $this->original_width , $this->original_height)){ //tworzy miniaturkę
  83.  
  84. if($this->typ == "image/jpeg"){
  85. imagejpeg($this->img_mini, $this->catalog."mini.".$this->name, 80); //zapisuje jpeg w folderze
  86. }
  87.  
  88. elseif($this->typ == "image/png"){
  89. imagepng($this->img_mini, $this->catalog."mini.".$this->name, 80); //zapisuje png w folderze
  90. }
  91.  
  92. else{
  93. imagegif($this->img_mini, $this->catalog."mini.".$this->name, 80); //zapisuje gif w folderze
  94. }
  95.  
  96. imagedestroy($this->img); //zwalnia pamięć
  97. imagedestroy($this->img_mini);
  98.  
  99. echo "Pomyślnie utworzono miniaturkę!";
  100. }
  101.  
  102. else{
  103. echo $this->error."<br/>"; //ilość wszytkich błędów w tablicy files
  104. throw new Exception("Błąd podczas tworzenia miniaturki pliku, spróbuj ponownie!");
  105. }
  106. }
  107.  
  108. else{
  109. echo $this->error."<br/>"; //ilość wszytkich błędów w tablicy files
  110. throw new Exception("Błąd podczas wgrywania pliku, spróbuj ponownie!");
  111. }
  112. }
  113.  
  114. else{
  115. echo "Plik jest zbyt duży!";
  116. }
  117. }
  118.  
  119. else{
  120. echo "Zły typ pliku!";
  121. }
  122. }
  123.  
  124. else{
  125. //upload
  126. if ($this->size <= $this->maxSize){
  127.  
  128. if(move_uploaded_file($this->name_tmp, $this->catalog.$this->name)){ //zapisuje plik w folderze
  129. echo "Pomyślnie wgrano plik!";
  130. }
  131.  
  132. else{
  133. echo $this->error."<br/>"; //ilość wszytkich błędów w tablicy files
  134. throw new Exception("Błąd podczas wgrywania pliku, spróbuj ponownie!");
  135. }
  136. }
  137.  
  138. else{
  139. echo "Plik jest zbyt duży!";
  140. }
  141. }
  142.  
  143. }
  144.  
  145. else{
  146. }
  147.  
  148. }
  149. }
  150.  
  151. $upload = new Upload;
  152. $upload->wgraj();
  153.  
  154. ?>
  155.  
  156. </body>
  157. </html>
Mlodycompany
Klasa sens może i ma, ale wykonanie liche. Do zmiennych w klasie dodaj setery i getery. Wyświetlanie błędów w klasie (echo 'błąd') jest złe.. Metoda powinna zwracać jakiś kod, ew. treść błędu i wyświetlanie już poza klasą. Każda metoda powinna mieścić się w 10 liniach kodu, u Ciebie są troche za długie. Takie są moje uwagi wink.gif
Pyton_000
Cytat
Każda metoda powinna mieścić się w 10 liniach kodu

Gdzie Ty to wyczytałeś wink.gif

zamiast echo błąd, lepiej throw new Exception
brak obsługi błędów imagecreatefrom....
metoda dane nie musi być widoczna jak public, możesz ją odpalać w wyslij(), bo i tak jedno bez drugiego nie ma sensu.
if($this->min == min) questionmark.gif

Tak na szybko
kujol
if($this->min == min)- porównuje wartość z checkboxa (czy ma stworzyć miniaturkę).
Pyton_000
a "min" to co ?
kujol
Jedno to value z checkbox, jeśli ktoś wciśnie checkbox to wysyła postem wartość min, która jest poruwnywana z min. Jeśli zwróci 1 to tworzy miniaturkę.
Głupie trochę rozwiązanie, potem to zamienię na isset().
Pyton_000
eee...
http://pl1.php.net/manual/en/function.min.php
markonix
Klasa oczywiście powinna być w osobnym pliku - mam nadzieje, że tak jak teraz jest to po prostu w celu "łatwiejszej" prezentacji.
Raz angielskie nazewnictwo, raz polskie - zostać przy jednym (wiadomo pierwsze lepsze, ale jeżeli to tylko dla ćwiczeń to może być w PL).

Mało elastyczna, w klasie nie powinno być żadnych odwołań do tablic. Wszystko powinno do klasy wchodzić za pomocą parametrów czy np. tablicy z ustawieniami.
kujol
Lekki edit u góry. Przerzuciłem metodę dane do wgraj, dodałem throw new Exception przy echo błąd, public zmieniłem na private i usunąłem odwołania do tablic z klasy.
Nazewnictwo zmienione na angielskie, klasa będzie w innym pliku.
Turson
  1. $this->wyslij = $_POST['wyslij'];
  2. ...
  3. if (isset($this->wyslij))

Na samym początku powinieneś sprawdzić czy został wciśnięty submit a nie przypisujesz go do $this->wyslij a potem sprawdzasz czy istnieje
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2018 Invision Power Services, Inc.