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

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


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

Листинг 1: Класс myValidatorFile для замены sfValidatorFile

<!--?php 
	  
	/** 
	 * myValidatorFile validates an 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 myValidatorFile extends sfValidatorFile 
	{ 
	  /** 
	   * Configures the current validator. 
	   * 
	   * 
	   * @param array $options   An array of options 
	   * @param array $messages  An array of error messages 
	   * 
	   * @see myValidatorBase 
	   */
	  protected function configure($options = array(), $messages = array()) 
	  { 
	    parent::configure($options, $messages); 
	  
	    $this--->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

<!--?php 
	  
	/** 
	 * Post form. 
	 * 
	 */
	class PostForm extends BasePostForm 
	{ 
	  public function configure() 
	  { 
	    parent::configure(); 
	  
	    $mime_types = array('image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 
	      'image/gif', 'video/x-flv', 'application/octet-stream'
	    ); 
	  
	    $this--->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