14

バックエンドアプリケーションのユーザーは、ファイルをアップロードしてフロントエンドに公開できます。sfWidgetFormInputFileとsfValidatorFileを使用して、ランダムな文字列のデフォルト機能の代わりに元のファイル名を保持したいと思います(つまり、a4b25e9f48cfb6268f34b691fc18cd76fefe96b5.docxの代わりにMeaningful_filename.docx-重複する名前に番号を追加できます)。これは、ユーザーが複数のファイルをダウンロードし、ファイル名と区別できない場合に役立ちます。

$this->widgetSchema['file_name'] = new sfWidgetFormInputFile(array('label' => 'File'));

$this->validatorSchema['file_name'] = new sfValidatorFile(array(
  'required'   => true,
  'path'       =>     sfConfig::get('sf_upload_dir').DIRECTORY_SEPARATOR.sfConfig::get('app_dir_file_sharing').DIRECTORY_SEPARATOR,
'mime_types' => array('application/msword',
                    'application/vnd.ms-word',
                    'application/msword',
                    'application/msword; charset=binary')
), array(
    'invalid'    => 'Invalid file.',
    'required'   => 'Select a file to upload.',
    'mime_types' => 'The file must be a supported type.'
));

sfWidgetFormInputFileウィジェットにネイティブ機能がありますか、それともこれに対する別の解決策がありますか?

4

3 に答える 3

22

を呼び出すことでファイルを取得します$form["file_name"]->getValue()sfValidatedFileこれにより、メソッドを呼び出すことができるクラスのオブジェクトが得られますgetOriginalName()


ファイルの保存方法を定義するには、次のようにします。クラスは、使用するクラスsfValidatorFileのオプションを受け入れます。sfValidatedFile

validated_file_class:クリーンアップされたアップロードファイルを管理するクラスの名前(オプション)

このsfValidatedFileクラスには、メソッドsaveを呼び出すメソッドがありgenerateFileNameます。このクラスをサブクラス化し、このメソッドを上書きします。

class CustomValidatedFile extends sfValidatedFile {
    /**
      * Generates a random filename for the current file.
      *
      * @return string A random name to represent the current file
      */
    public function generateFilename()
    {
        return 'foo bar'// your custom generated file name;
    }
}

元のクラスの関数は次のとおりです。

public function generateFilename()
{
    return sha1($this->getOriginalName().rand(11111, 99999)).$this->getExtension($this->getOriginalExtension());
}

次に、次のようにバリデーターを設定します。

$this->validatorSchema['file_name'] = new sfValidatorFile(array(
      'required'   => true,
      'path' =>   'yourpath',
      'validated_file_class' => 'CustomValidatedFile',
      'mime_types' => array('application/msword',
                            'application/vnd.ms-word',
                            'application/msword',
                            'application/msword; charset=binary')
     ), 
     array('invalid'    => 'Invalid file.',
           'required'   => 'Select a file to upload.',
           'mime_types' => 'The file must be a supported type.')
);

お役に立てば幸いです。

于 2010-01-25T23:03:25.233 に答える
5

いくつかの調査の後:

sfValidatedFileを拡張し、generateFilenameをオーバーライドすることはできますが、sfFormPropelは、ファイルに名前を付けるモデルの列名に基づいてメソッドの存在をチェックすることがわかりました。

symfony / plugins / sfPropelPlugin / lib / formの292行目から:

$method = sprintf('generate%sFilename', $column);
if (null !== $filename)
{
  return $file->save($filename);
}
else if (method_exists($this, $method))
{
  return $file->save($this->$method($file));
}

したがって、列の名前がfile_nameの場合、メソッドはフォームクラスにgenerateFileNameFilenameが存在するかどうかを検索します。このように、sfValidatedFileウィジェットを拡張するのではなく、フォームクラスに1つのメソッドを追加するだけで済みます。たとえば、私の関数は、元の名前が取得されていない場合は元の名前を使用し、そうでない場合は連番を追加します(1つの方法は、生成されたファイル名を再帰的にチェックすることです)。

public function generateFileNameFilename($file = null)
{
  if (null === $file) {
    // use a random filename instead
    return null;
  }

  if (file_exists($file->getpath().$file->getOriginalName())) {
     return $this->appendToName($file);
  }

  return $file->getOriginalName();
}

public function appendToName($file, $index = 0)
{
    $newname = pathinfo($file->getOriginalName(), PATHINFO_FILENAME).$index.$file->getExtension();

    if (file_exists($file->getpath().$newname)) {
       return $this->appendToName($file, ++$index);
    } else {
       return $newname;
    }
 }

symfony APIでこれが文書化されているのはどこにも見つかりません。そのため、コードベースを検索して見つけるのに時間がかかりました。このメソッドを多くの場所で使用している場合は、sfValidatedFileを拡張することも適切なオプションです。

于 2010-01-25T23:38:23.047 に答える
1

Symfonyのドキュメントによると、「sfValidatorFileバリデーターはアップロードされたファイルを検証します。バリデーターはアップロードされたファイルをsfValidatedFileクラスのインスタンス、または設定されている場合はvalidated_file_classオプションのインスタンスに変換します。」(出典:http ://www.symfony-project.org/forms/1_4/en/B-Validators#chapter_b_sub_sfvalidatorfile )

sfValidatedFileクラスは、箱から出してすぐにファイルの名前を変更しますが、validated_file_classをカスタムクラスに設定し、sfValidatedFileを拡張することで、この関数をオーバーライドできます。

カスタム検証済みファイルクラスで、カスタムファイル名をsave()メソッドに渡します。「ファイル名を渡さない場合は、generateFilenameメソッドによって生成されます。」(出典: http ://www.symfony-project.org/api/1_4/sfValidatedFile#method_save )

これがあなたがそれをすることができる1つの方法です(出典: http: //forum.symfony-project.org/index.php/m/90887/#msg_90887)...

カスタム検証済みファイルクラス:

// lib/validator/myValidatedFile.php
class myValidatedFile extends sfValidatedFile {
  private $savedFilename = null;

  // Override sfValidatedFile's save method
  public function save($file = null, $fileMode = 0666, $create = true, $dirMode = 0777) {
    // This makes sure we use only one savedFilename (it will be the first)
    if ($this->savedFilename === null) $this->savedFilename = $file;

    // Let the original save method do its magic :)
    return parent::save($this->savedFilename, $fileMode, $create, $dirMode);
  }
}

必ず'validated_file_class' => 'myValidatedFile'sfWidgetFormInputFileに設定してください。また、Formのsaveメソッドでファイル名がどのようになるかについてのロジックを設定します。

于 2010-01-25T23:10:29.597 に答える