如何让用户选择上传目录?

时间:2011-02-09 09:55:35

标签: file-upload symfony1

我有一个用于在我的博客引擎中上传图片的表单。文件上传到 web / uploads ,但我想添加一个“选择”小部件,让用户从文件夹列表中选择,例如“照片”,“剪贴画”,标志。

这是我的表单

class ImageForm extends BaseForm
{
  public function configure()
  {
    $this->widgetSchema->setNameFormat('image[%s]');

    $this->setWidget('file', new sfWidgetFormInputFileEditable(
      array(
        'edit_mode'=>false,
        'with_delete' => false,
        'file_src' => '',
        )
    ));

    $this->setValidator('file', new mysfValidatorFile(
      array(
        'max_size' => 500000,
        'mime_types' => 'web_images',
        'path' => 'uploads',
        'required' => true
        )

    ));

    $this->setWidget('folder', new sfWidgetFormChoice(array(
      'expanded' => false,
      'multiple' => false,
      'choices'  => array('photos', 'cliparts', 'logos')
       )
    ));

    $this->setValidator('folder', new sfValidatorChoice(array(
      'choices' => array(0,1,2)
    )));


  }


}

,这是我的行动:

  public function executeAjout(sfWebRequest $request)
  {
    $this->form = new ImageForm();

    if ($request->isMethod('post'))
    {
      $this->form->bind(
        $request->getParameter($this->form->getName()),
        $request->getFiles($this->form->getName())
      );

      if ($this->form->isValid())
      {
           $this->form->getValue('file')->save();
           $this->image = $this->form->getValue('file');
      }

    }

我正在使用自定义文件验证程序:

class mySfValidatorFile extends sfValidatorFile
{

    protected function configure($options = array(), $messages =
array())
    {
        parent::configure();
        $this->addOption('validated_file_class',
'sfValidatedFileFab');
    }

}

class sfValidatedFileFab extends sfValidatedFile
{
    public function generateFilename()
    {
      return $this->getOriginalName();
    }
} 

那么如何告诉文件上传小部件将图像保存在不同的文件夹中?

2 个答案:

答案 0 :(得分:0)

您可以将您所说的目录名称('photos','cliparts','logos')连接到sf_upload_dir,如下面的代码所示,您当然需要创建这些目录。

$this->validatorSchema['file'] = new sfValidatorFile(
          array('path' => sfConfig::get('sf_upload_dir' . '/' . $path)
       ));

此外,您可以在app.yml配置文件中包含这些目录详细信息,并让他们调用sfConfig::get()方法。

答案 1 :(得分:0)

我使用以下代码:

  public function executeAdd(sfWebRequest $request)
  {
    $this->form = new ImageForm();

    if ($request->isMethod('post'))
    {
      $this->form->bind(
        $request->getParameter($this->form->getName()),
        $request->getFiles($this->form->getName())
      );

      if ($this->form->isValid())
      {
           //quel est le dossier ?
           switch($this->form->getValue('folder'))
           {
             case 0:
               $this->folder = '/images/clipart/';
               break;
             case 1:
               $this->folder = '/images/test/';
               break;
             case 2:
               $this->folder = '/images/program/';
               break;
             case 3:
               $this->folder = '/images/smilies/';
               break;

           }

           $filename = $this->form->getValue('file')->getOriginalName();
           $this->form->getValue('file')->save(sfConfig::get('sf_web_dir').$this->folder.$filename);

           //path :
           $this->image = $this->folder.$filename;
      }

    }