Dec 10 2008

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

Category: Symfonyingvar @ 21:25

В 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

Ссылки по теме:
The symfony Forms Book :: Chapter 4 — Propel Integration :: The save() method
Symfony: 14-Generators#Administration

Tags:

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

  1. KoXxX says:

    I don’t read russian, but I managed, thank you so much !

Leave a Reply