Symfony 1.2: решение проблемы загрузки flv файлов в админке

Symfony framework

Автор: Александр Степанов

5 февр. 2013 г., 10:55:03  990


В Symfony есть одна неприятная проблемка. Если попытаться залить файлы .flv в админке, то после того как файл запишется на диск, мы получим расширение файла в виде: .exe и .obj, . В предыдущей версии Symfony 1.1 это решалось перекрытием методов в actions.class.php, и исправлениями других файлов. Конечно проблему это решило, но её реализация была так себе. В новой версии решил написать по другому и получилось все очень просто. Почему так происходит? При загрузке .flv файлов они определяться как application/octet-stream, а в Symfony это как раз тип файлов .exe. Поэтому создаем свой myValidatorFile, который наследует sfValidatorFile и решает проблему. Листинг 1: Класс myValidatorFile для замены sfValidatorFile

addOption('validated_file_class', 'myValidatedFile'); 
	  } 
	} 
	  
	/** 
	 * myValidatedFile represents a validated uploaded file. 
	 * 
	 * 
	 * Fix problem with flv file upload in Admin Generator 
	 * 
	 * @package    symfony 
	 * @subpackage validator 
	 * @author     Igor Brovchenko webdev [at] tigor [dot] com [dot] ua 
	 */
	class myValidatedFile extends sfValidatedFile 
	{ 
	  
	  /** 
	   * Returns the extension associated with the given content type. 
	   * 
	   * @param  string $type     The content type 
	   * @param  string $default  The default extension to use 
	   * 
	   * @return string The extension (with the dot) 
	   */
	  protected function getExtensionFromType($type, $default = '') 
	  { 
	    if($type == 'application/octet-stream' && '.flv' == strtolower($default)) 
	    { 
	        return '.flv'; 
	    } 
	  
	    return parent::getExtensionFromType($type, $default = ''); 
	  } 
	  
	}

Листинг 2: Пример использования myValidatorFile

setWidget('file', new sfWidgetFormInputFileEditable(array( 
	      'is_image'       => true 
	    ))); 
	  
	    $this->validatorSchema['file'] = new myValidatorFile(array( 
	      'required'   => false, 
	      'mime_types' => $mime_types, 
	      'path'       => sfConfig::get('sf_upload_dir') . '/video', 
	    )); 
	  
	    $this->validatorSchema->setOption('allow_extra_fields', true); 
	    $this->validatorSchema->setOption('filter_extra_fields', false); 
	  } 
	  
	}

Что сделали:

  • • добавили новый mime_type ‘application/octet-stream’
  • • указали свой валидатор myValidatorFile