Загрузка файлов на сервер Joomla.

  1. // Импорт библиотек
  2. jimport (  'joomla.filesystem.folder'  ) ;
  3. jimport (  'joomla.filesystem.file'  ) ; 
  4.  
  5. // получаем загружаемые файлы
  6. $input  = JFactory::getApplication()->input ;
  7. $files  =  $input -> files -> get (  'file_name_form' ,  array ( ) ,  'array'  ) ; 
  8.  
  9. // Создадим каталог для наших файлов, если еще нет
  10. if  (  !JFolder::exists ( JPATH_SITE  .  '/files'  )  )  {
  11.      JFolder::create ( JPATH_SITE  .  '/files'  ) ;
  12.      // создадим файл заглушку
  13.      $file  =  fopen ( JPATH_SITE  .  '/files/index.html' ,  'w'  ) ;
  14.      fclose (  $file  ) ;
  15. } 
  16.  
  17. // переименовать файл
  18. JFile::move (  $file [ 'name' ] ,  $newName ,  $pathToFile  ) ;
  19.  
  20. // переименовать каталог
  21. JFolder::move (  $folderName ,  $newFolderName ,  $pathToFolder  ) ;
  22.  
  23. // переводим размер файлов в МБ, 
  24. // в дальнейшем можно сделать проверку на максимальный размер загружаемого файла
  25. $filesize  =  round ( $file [ 'size' ] / ( 1048576 ) ,  2 ) ;
  26.  
  27. // Удаление каталога
  28. JFolder::delete ( $folderName ) ;
  29.  
  30. // Удаление файла если есть в каталоге
  31. // $fileName - имя Файла
  32. if  ( JFile::exists ( $fileName )  )  {
  33.    JFile::delete ( JPATH_SITE  .  '/' .  $fileName  ) ;
  34. }

Более подробнее разберем API-Jooml'овый метод загрузки файлов - JFile::upload(). В версии Joomla 3.4.8 замечена проблема при загрузке файлов с форматами как: zip, rar, tar, gz, tgz, bz2, tbz, jpa. Причем ошибку CMS не выдает, а записывает информацию в лог. И так разберем более детально: 

  • JFile :: upload ( 
  •    (string )  $src , 
  •    (string )  $dest , 
  •    (boolean :  true | false )  $use_streams , 
  •    (boolean :  true | false )  $allow_unsafe , 
  •    ( array )  $safeFileOptions 
  • ) ;
  • $src - временное имя загружаемого файла
  • $dest - путь (включющий имя файла), для перемещения загружаемого файла
  • $use_streams - использование потока (да, нет) по умолчанию, нет (связь с параметром open_base_dir)
  • $allow_unsafe - самый важный параметр, отвечающий за загрузку безопасных файлов, по умолчанию включена.
  • $safeFileOptions - массив, который содержит в себе набор опасных файлов.

Самый коварный $safeFileOptions, сейчас поймете почему. И так при загрузке файлов как я уже говорил набор опасных форматов зашит в CMS, но тем не менее если мы хотим сделать некоторые форматы безопасными, то переопределим их в массиве $safeFileOptions, и передадим в качестве параметра такой массив:

  • array ( 'php_ext_content_extensions'  =>  array ( 'tar' ,  'gz' ,  'tgz' ,  'bz2' ,  'tbz' ,  'jpa' ) )

В нем мы видим, что нет .rar и .zip форматов, т.е. мы считаем их безопасными. В итоге наш метод будет выглядеть следующим образом:

  • // Загружаем файл
  • JFile :: upload ( 
  •       $file [ 'tmp_name' ] , 
  •      JPATH_SITE  .  '/files/'  .  $file [ 'tmp_name' ] , 
  •       false , 
  •       false , 
  •       array ( 'php_ext_content_extensions'  =>  array ( 'tar' ,  'gz' ,  'tgz' ,  'bz2' ,  'tbz' ,  'jpa' ) ) 
  • ) ;

Данное поведение зависит от фильтрации приходящих данных в этом месте:

  • // третий принимаемый параметр 'array' как раз и фильтрует данные.
  • $input -> files -> get (  'file_name_form' ,  array ( ) ,  'array'  ) ;

Если вы уверены, что данные всегда будут приходить безопасными, то конструкцию выше с применением форматов файлов можно не использовать, а при загрузке файлов применять метод с параметром "raw", т.е. вообще не проверять формат:

  • // третий принимаемый параметр 'raw' отменяет фильтрацию.
  • $input -> files -> get (  'file_name_form' ,  array ( ) ,  'raw'  ) ;

В зависимости от задачи иногда требуется узнать размер файла, для это необходимо использовать следующую конструкцию:

  • // Создаем новый объект потока
  • $stream = JFactory::getStream();
  • // Откроем поток
  • $stream->open($filePath);
  • // Получим размер файла
  • $fileSize = $stream->filesize($filePath);
  • // Выведем размер файла
  • $fileSize = JHtml::_('number.bytes', $fileSize);
  • // Закроем поток
  • $stream->close();

Обратите внимание, что для загрузки файлов с русскими символами, возможны ошибки при загрузке. Идеальный обход такой проблемы создать отдельную табличку в Базе Данных, именовать в файл в hash виде, и хранить реальные имена именно в БД, а файлы загружать в кодированном имени. Так же форма должна иметь обязательно атрибут enctype="multipart/form-data"

Вы можете пожертвовать любую сумму для мотивации новых статей.
Создание сайтов

Читайте также:

Полезное из Web