За последние 24 часа нас посетили 18822 программиста и 1702 робота. Сейчас ищут 716 программистов ...

Загрузка файлов

Тема в разделе "PHP для новичков", создана пользователем kentkent7, 9 авг 2017.

  1. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Всем доброго дня :)
    Изучаю загрузку файлов, можете оценить мой говнокод)))
    Код (Text):
    1. <?php
    2. @mkdir ("uploads", 0777);
    3.  
    4. $file_name = $_FILES ['image']['name'];
    5. $type = $_FILES ['image']['type'];
    6. $tmp = $_FILES ['image']['tmp_name'];
    7. $error = $_FILES ['image']['error'];
    8. $error = [
    9. 'size' => "Размер фото до 4 mb",
    10. 'file_name' => "Название фото до 200 сим"
    11. ];
    12. $size = $_FILES ['image']['size'];
    13. $file_dir = "uploads/";
    14.  
    15. if ($size > 4194304) {
    16.    echo $error['size'];
    17. } elseif ($file_name > 200) {
    18.      echo $error['file_name'];
    19. } elseif (is_uploaded_file($tmp)) {
    20. move_uploaded_file($tmp,"$file_dir.$file_name");
    21.     echo "Фото успешно загружено";
    22. } else {
    23.     echo "Пожалуйста загрузите фото";
    24. }
    25. ?>
    26.  
    27.  
    28. <form action="donwload.php" method="post" enctype="multipart/form-data">
    29.    
    30. <input type="file" name="image">  
    31. <input type="submit">  
    32. </form>
    --- Добавлено ---
    Долго думал как сделать проверку формата, ну так чтобы файлы jpg, jpeg, img, подскажите как реализовать.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    пару минут..
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. interface FilesUp
    6. {
    7.     public function SaveDirectory( string $DIRECTORY );    # Директория для сохранения файла
    8.    public function SaveFile(): bool;                # Функция валидации и сохранения файла
    9.    public function FileName(): string;                # Вывод имя файла с расширением
    10.    public function ErrorMessage(): array;            # Вывод ошибок
    11. }
    12.  
    13. class GDImageUp implements FilesUp
    14. {
    15.     # Максимальный размер файла
    16.    const MAX_SIZE_IMG = ( 1024 * 1024 * 5 );
    17.  
    18.     # Разрешенный тип передаваемого файла
    19.    const MIME_TYPE = [ 'image/png', 'image/jpeg', 'image/gif' ];
    20.  
    21.     private
    22.         $_mime_type = [],
    23.         $_max_size_img,
    24.         $_width = 200,
    25.         $_height = 200,
    26.         $_directory = NULL,
    27.         $_name,
    28.         $_E = [];
    29.  
    30.     public function __construct ( string $KEY, $SIZE = FALSE )
    31.     {
    32.         $this -> _key = $KEY;
    33.         $this -> _name = basename ( $_FILES[$KEY]['name'] ?? NULL );
    34.         $this -> _max_size_img = ( $SIZE ?? self::MAX_SIZE_IMG );
    35.     }
    36.     public function setMimeType( ...$A )
    37.     {
    38.         $this -> _mime_type = $A;
    39.      
    40.         return $this;
    41.     }
    42.     public function ImageSize( int $W, int $H )
    43.     {
    44.         $this -> _width = $W;
    45.         $this -> _height = $H;
    46.      
    47.         return $this;
    48.     }
    49.     public function SaveDirectory( string $DIR )
    50.     {
    51.         $this -> _directory = "{$_SERVER['DOCUMENT_ROOT']}/{$DIR}";
    52.      
    53.         return $this;
    54.     }
    55.     public function SaveName( string $NAME )
    56.     {
    57.         $this -> _name = $NAME;
    58.      
    59.         return $this;
    60.     }
    61.     public function ErrorMessage(): array
    62.     {
    63.         return $this -> _E;
    64.     }
    65.     public function FileName(): string
    66.     {
    67.         return $this -> _name;
    68.     }
    69.     private function ErrorCode( int $A ): string
    70.     {
    71.         return [
    72.             0 => FALSE,
    73.             2 => FALSE,
    74.             UPLOAD_ERR_INI_SIZE => 'Размер принятого файла превысил максимально допустимый размер.',
    75.             UPLOAD_ERR_PARTIAL => 'Загружаемый файл был получен только частично.',
    76.             UPLOAD_ERR_NO_FILE => 'Файл не был загружен.',
    77.             UPLOAD_ERR_NO_TMP_DIR => 'Отсутствует временная папка.',
    78.             UPLOAD_ERR_CANT_WRITE => 'Не удалось записать файл на диск.',
    79.             UPLOAD_ERR_EXTENSION => 'PHP - расширение остановило загрузку файла'
    80.         ][$A];
    81.     }
    82.     public function SaveFile(): bool
    83.     {
    84.         if ( !isset ( $_FILES[$this -> _key] ) )
    85.         {
    86.             $this -> _E['undefined'] = 'Undefined input name in:' . $this -> _key;
    87.          
    88.             return FALSE;
    89.         }    
    90.         if ( !empty ( $this -> ErrorCode( $_FILES[$this -> _key]['error'] ) ) )
    91.         {
    92.             $this -> _E['message'] = $this -> ErrorCode( $_FILES[$this -> _key]['error'] );
    93.          
    94.             return FALSE;
    95.         }
    96.         if ( !file_exists ( $this -> _directory ) )
    97.         {
    98.             $this -> _E['dir'] = 'Invalid is directory';
    99.         }
    100.         if ( count ( array_diff ( $this -> _mime_type, self::MIME_TYPE ) ) > 0 )
    101.         {
    102.             $this -> _E['property_type'] = 'Denied access Mime type in: ' . implode ( ', ', $D );
    103.         }
    104.         elseif ( !in_array ( $_FILES[$this -> _key]['type'], ( $this -> _mime_type ?: self::MIME_TYPE ) ) )
    105.         {
    106.             $this -> _E['type'] = 'Invalid Mime type File';
    107.         }
    108.         else
    109.         {
    110.             switch ( $_FILES[$this -> _key]['type'] )
    111.             {
    112.                 case 'image/png':
    113.                     $IGD = ImageCreateFromPNG ( $_FILES[$this -> _key]['tmp_name'] );
    114.                 break;
    115.                 case 'image/jpeg':
    116.                     $IGD = ImageCreateFromJPEG ( $_FILES[$this -> _key]['tmp_name'] );
    117.                 break;
    118.                 case 'image/gif':
    119.                     $IGD = ImageCreateFromGIF ( $_FILES[$this -> _key]['tmp_name'] );
    120.                 break;
    121.             }
    122.          
    123.             $SX = ImageSX ( $IGD );
    124.             $SY = ImageSY ( $IGD );
    125.          
    126.             if ( $this -> _width < $SX || $this -> _height < $SY )
    127.             {
    128.                 $this -> _E['imagesize'] = 'Invalid image size';
    129.             }
    130.             if ( $this -> _max_size_img < $_FILES[$this -> _key]['size'] )
    131.             {
    132.                 $this -> _E['filesize'] = 'Invalid File size';
    133.             }
    134.         }
    135.      
    136.         if ( count ( $this -> _E ) > 0 ) return FALSE;
    137.      
    138.         $IMG = ImageCreateTrueColor ( $SX, $SY );
    139.      
    140.         ImageCopyResampled ( $IMG, $IGD, 0, 0, 0, 0, $SX, $SY, $SX, $SY );
    141.      
    142.         switch ( $_FILES[$this -> _key]['type'] )
    143.         {
    144.             case 'image/png':
    145.                 $NAME = $this -> _name . '.png';
    146.                 ImagePNG ( $IMG, $this -> _directory . DIRECTORY_SEPARATOR . $NAME );
    147.             break;
    148.             case 'image/jpeg':
    149.                 $NAME = $this -> _name . '.jpg';
    150.                 ImageJPEG ( $IMG, $this -> _directory . DIRECTORY_SEPARATOR . $NAME );
    151.             break;
    152.             case 'image/gif':
    153.                 $NAME = $this -> _name . '.gif';
    154.                 ImageGIF ( $IMG, $this -> _directory . DIRECTORY_SEPARATOR . $NAME );
    155.             break;
    156.         }
    157.      
    158.         $this -> _name = $NAME;
    159.      
    160.         ImageDestroy ( $IMG );
    161.      
    162.         return $NAME;
    163.     }
    164. }
    165.  
    166. if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    167. {
    168.     $G = new GDImageUp( 'pictures', ( 1024 * 1024 * 2 ) );
    169.  
    170.     if ( $G -> setMimeType( 'image/jpeg' ) -> ImageSize( 2000, 2000 ) -> SaveDirectory( 'upload/' ) -> SaveName( 'lalka' ) -> SaveFile() === FALSE )
    171.     {
    172.         var_dump ( $G -> ErrorMessage() );
    173.     }
    174.     echo $G -> FileName();
    175. }
    176. ?>
    177. <form enctype="multipart/form-data" method="post" action="/Upload.php">
    178. <input type="file" name="pictures">
    179. <input type="submit" value="ooooo">
    180. </form>
    https://github.com/MouseZver/My-garbage-code/blob/master/upload_class/Upload.php
     
    Dimon2x нравится это.
  4. sk-_-

    sk-_- Новичок

    С нами с:
    9 авг 2017
    Сообщения:
    7
    Симпатии:
    2
    Нет проверки на тип загружаемого файла. Ничто не мешает загрузить что-то еще, и если картинка на сервере будет только так храниться (4 мб много) , то еще куда не шло, а если нет, то нужно ресайзить и потом сохранять. CIMAGE в помощь
    --- Добавлено ---
    Если совсем просто, то можно получить расширение из названия файла, но часто в работе грузят всякие bmp с расширением jpeg
    В массиве FILES можешь глянуть $_FILES поле type. Как правило там есть расширение
    https://php.ru/manual/function.finfo-file.html - это уже более серьезная проверка
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    Нет
    Нет
    Нет
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а что там за значение? кто его указывает?
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    стоп сорь , если в изображении поменять тупо расширение, то мой скрипт крашнется :rolleyes:
    +
     
  8. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Спасибо большое!
    Я пока только учусь, не все понимаю в этом коде, буду его разбирать.