Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pierwsza klasa
Forum PHP.pl > Forum > Przedszkole
-gość-
Witam uczę się właśnie programowania obiektowego i napisałem taką prostą klasę, czy moglibyście mnie nakierować na moje błędy?
  1. <?php
  2.  
  3. /**
  4.  * Klasa odpowiedzialna za upload
  5.  *
  6.  */
  7. class Upload {
  8.  
  9. /**
  10.   * Tablica zawierająca dopuszczalne formaty plików,
  11.   * jeżeli pusta to pozwala na wgrywanie dowolnego rodzaju pliku
  12.   * @var array
  13.   */
  14. protected $aAllowedExtensions = array();
  15.  
  16. /**
  17.   * Zawiera rozszerzenie pliku
  18.   * @var string
  19.   */
  20. protected $sFileExtension = '';
  21.  
  22. /**
  23.   * Dopuszczalny rozmiar pliku w bitach, domyślnie 1 MB
  24.   * @var int
  25.   */
  26. protected $iMaxSize = 8388608;
  27.  
  28. /**
  29.   * Tablica zawierająca kody błędów
  30.   * @var array
  31.   */
  32. protected $aErrorCodes = array(
  33. 1, //plik ma błędny typ
  34. 2, //plik jest zbyt duży
  35. 3, //brak pliku
  36. 4, //ścieżka nie pozwala na zapis
  37. 5. //inny błąd
  38. );
  39.  
  40. /**
  41.   * Ścieżka gdzie pliki mają być wgrywane
  42.   * @var string
  43.   */
  44. protected $sUploadPath = '';
  45.  
  46. /**
  47.   * Nazwa wgranego pliku, jeżeli pusta zostanie wygenerowana losowa
  48.   * @var string
  49.   */
  50. protected $sFileName = '';
  51.  
  52. /**
  53.   * Czy zachować oryginalną nazwę pliku,
  54.   * uwaga jeżeli true, to sFileName nie jest brane pod uwagę i
  55.   * zostanie nadpisana
  56.   * @var bool
  57.   */
  58. protected $bOriginalName = false;
  59.  
  60. /**
  61.   * Zawiera pełną ścieżkę wgranego pliku
  62.   * @var string
  63.   */
  64. protected $sResult;
  65.  
  66. /**
  67.   * Zawiera kod błędu
  68.   * @var int
  69.   */
  70. protected $iErrorCode = 0;
  71.  
  72.  
  73. /**
  74.   * Konstruktor
  75.   * @param string $sUploadPath
  76.   * @param array $aAllowedExtensions [optional]
  77.   * <p>Dopuszczalne formaty plików</p>
  78.   * @param int $iMaxSize [optional]
  79.   * <p>Maksymalny rozmiar pliku wgrywanego,
  80.   * podawana w bitach, domyślnie 1MB (8388608 bitów)</p>
  81.   * @return \lib_Upload
  82.   */
  83. public function __construct($sUploadPath, $aAllowedExtensions = array(), $iMaxSize = 8388608) {
  84. $this->sUploadPath = (string) $sUploadPath;
  85. $this->iMaxSize = (int) $iMaxSize;
  86. $this->aAllowedExtensions = $aAllowedExtensions;
  87. return $this;
  88. html_entity_decode($sUploadPath);
  89. }
  90.  
  91. /**
  92.   * @param type $sFileName
  93.   * @return \lib_Upload
  94.   */
  95. public function setFileName($sFileName) {
  96. $this->sFileName = $sFileName;
  97. return $this;
  98. }
  99.  
  100. /**
  101.   * Zwraca kod błędu
  102.   * @return int
  103.   */
  104. public function getErrorCode() {
  105. return $this->iErrorCode;
  106. }
  107.  
  108. /**
  109.   * Zwraca pełną scieżkę do pliku wgranego
  110.   */
  111. public function getResult() {
  112. return $this->sResult;
  113. }
  114.  
  115. /**
  116.   * Metoda sprawdzająca czy plik ma poprawne rozszerzenie
  117.   * return bool
  118.   */
  119. public function checkExtension($sFileName) {
  120. $aTmp = explode('.', $sFileName);
  121. if(!empty($aTmp)) {
  122. $this->sFileExtension = strtolower(end($aTmp));
  123. }
  124.  
  125. if(empty($this->aAllowedExtensions) || in_array($this->sFileExtension, $this->aAllowedExtensions)) {
  126. return true;
  127. } else {
  128. return false;
  129. }
  130. }
  131.  
  132. public function moveFile($sFileIndex) {
  133. if($this->bOriginalName) {
  134. $this->sFileName = $_FILES[$sFileIndex]['name'];
  135. } elseif(empty($this->sFileName)) {
  136. $this->sFileName = md5($_FILES[$sFileIndex]['name']).uniqid().'.'.$this->sFileExtension;
  137. }
  138. if(!empty($this->sUploadPath) && substr($this->sUploadPath, -1) !='/') {
  139. $this->sUploadPath .= '/';
  140. }
  141. $this->sResult = $this->sUploadPath.$this->sFileName;
  142.  
  143. if(move_uploaded_file($_FILES[$sFileIndex]['tmp_name'], $this->sResult)) {
  144. return true;
  145. } else {
  146. return false;
  147. }
  148. }
  149.  
  150. /**
  151.   * Metoda odpowiedzialna za upload
  152.   * @param string $sFileIndex
  153.   * @return boolean
  154.   */
  155. public function upload($sFileIndex) {
  156. if(isset($_FILES[$sFileIndex]) && is_uploaded_file($_FILES[$sFileIndex]['tmp_name']) ){
  157. if($_FILES[$sFileIndex]['size'] > $this->iMaxSize ){
  158. $this->iErrorCode = 2;
  159. return false;
  160. }
  161. if(!$this->checkExtension($_FILES[$sFileIndex]['name'])) {
  162. $this->iErrorCode = 1;
  163. return false;
  164. }
  165. if($this->moveFile($sFileIndex)) {
  166. return true;
  167. } else {
  168. $this->iErrorCode = 4;
  169. return false;
  170. }
  171.  
  172. }else {
  173. $this->iErrorCode = 3;
  174. return false;
  175. }
  176. }
  177.  
  178. }
  179.  
  180.  
  181. $oUpload = new Upload('tmp');
  182. if($oUpload->upload('img')) {
  183. //plik się wgrał poprawnie
  184. } else {
  185. echo $oUpload->getErrorCode(); //kod błędu
  186. }
  187.  

W zamyślę to będzie klasa matka dla klas odpowiedzialnych za wgrywanie i zabawę z obrazkami czy bardziej specyficznymi plikami
IceManSpy
Co do funkcji setFileName zrób jeszcze tak, że jeśli użytkownik nie wywoła tej metody (nie przypisze nazwy), to niech przypisze dla pliku losową nazwę.

Oprócz rozszerzenia powinieneś sprawdzać typ MIME: http://pl.wikipedia.org/wiki/Typ_MIME

Nigdzie nie wykorzystujesz: aErrorCodes .
Fifi209
I zamiast dziwacznych błędów rzucać wyjątkami.

P.S. Nie ten dział
-gość-
IceManSpy co do losowej nazwy to już to było:
  1. if($this->bOriginalName) {
  2. $this->sFileName = $_FILES[$sFileIndex]['name'];
  3. } elseif(empty($this->sFileName)) {
  4. $this->sFileName = md5($_FILES[$sFileIndex]['name']).uniqid().'.'.$this->sFileExtension;
  5. }

w metodzie moveFiles

Co do tablicy aErrorCodes to racze ma funkcje przypominającą co który kod oznacza.

Co do typu mime to nie mam pojęcia jak sprawdzić prawdziwy typ mime pliku, bo wiem, że przez przeglądarke można zafałszować.

Fifi209 nie za bardzo rozumiem jeszcze używanie wyjątków (szczególnie kiedy i jak powienienem ich używać), jeżeli znasz jakiś artykuł na ten temat z chęcią go przeczytam. ewentualnie czy mógłbyś pokazać jak użyć przy takiej klasie?
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-2025 Invision Power Services, Inc.