2013-08-28 2 views
1

Я разрабатываю компонент Joomla, который должен обеспечивать функциональность для загрузки файлов. Я следовал за guidelines от docs.joomla.org, и вывел следующую функцию:Joomla JFile :: upload Issue

public function fileupload() 
{ 

    $jinput = JFactory::getApplication()->input; 
    $files = $jinput->files->get('jform','array',null); 

    $fileError=$files['image']['error']; 

    If ($fileError>0){ 

     switch (true){ 

      case $fileError==1: 
      echo JText::_('FILE TO LARGE THAN PHP INI ALLOWS'); 
      return; 

      case $fileError==2: 
      echo JText::_('FILE TO LARGE THAN HTML FORM ALLOWS'); 
      return; 

      case $fileError==3: 
      echo JText::_('ERROR PARTIAL UPLOAD'); 
      return; 

      case $fileError==4: 
      echo JText::_('ERROR NO FILE'); 
      return; 

     } 
    } 

    $filesize=$files['image']['size']; 

    If ($filesize>2000000){ 

    echo JText::_('FILE BIGGER THAN 2MB');  

    } 

    $fileTemp=$files['image']['tmp_name']; 


    $imageinfo = getimagesize($fileTemp); 
    $okMIMETypes = 'image/jpeg,image/jpg,image/pjpeg,image/png,image/x-png,image/gif'; 
    $validFileTypes = explode(",", $okMIMETypes); 

    if(!is_int($imageinfo[0]) || !is_int($imageinfo[1]) || !in_array($imageinfo['mime'], $validFileTypes)) 
    { 
    echo JText::_('INVALID FILETYPE'); 
    return; 
    } 

    $fileName = preg_replace("/[^A-Za-z0-9]/i", "-", $fileName); 

    $uploadPath = JPATH_Component.DS.$fileName; 

    if(!JFile::upload($fileTemp, $uploadPath)) 
    { 
      echo JText::_('ERROR MOVING FILEs'.$fileTemp); 
      return; 
    } 
    else 
    { 
     // success, exit with code 0 for Mac users, otherwise they receive an IO Error 
     exit(0); 
    } 

    If (isset($files)){ 
    $name = $files['image']['name']; 
    $size = $files['image']['size']; 
    } 

    $this->setRedirect(JRoute::_('index.php? 
      option=com_name&view=confirmation&filename='.$name.'&filesize='. 
      $size.'&tmp='.$fileTemp.'&dir=', false)); 


     } 

Дело в том, что «JFile::upload($fileTemp, $uploadPath)» не всегда приводит к ошибке

Can't move File 

Путь к ТМП -папка правильная (*/shared-data/webroot/01_Playground/tmp *), в зависимости от другой записи в stackoverflow, я установил права доступа к файлу 644, а разрешение на директорию 755 (я также пробовал 777), без успеха так далеко. $files['image']['tmp_name'] возвращает значение, но в моей tmp-папке ничего нет. (Я пробовал этот фрагмент кода на linux-ubuntu, а также на windows, без успеха.) Возможно, кто-то знает рабочее решение для моей проблемы?

Обновление: после активации сообщения об ошибках и использования var_dump я выяснил следующее: оно имеет какое-то отношение к exit (0); Я удалил строку, содержащую exit (0), и она работает так, как должна быть.

+0

вы пытались использовать 'var_dump(); 'с некоторыми из переменных, чтобы они функциональны? – Lodder

+0

2 Вопросы: Как выглядит ваша форма? А где метод 'fileupload()'? – Craig

+0

Я не знаю, если вы следовали за последним выпуском безопасности, но вам нужно сделать более обширную проверку файла. Есть ли веская причина не просто использовать JFormFiledMedia или использовать JMediaHelper? – Elin

ответ

0

Ваш файл не загружается в папку Joomla tmp, а находится в папке PHP tmp.

Таким образом, ваш код должен выглядеть следующим образом:

$fileTemp=ini_get('upload_tmp_dir') . $files['image']['tmp_name'];