Nasıl Symfony'de yükleme sonra Orijinal Dosya korumak yok

3 Cevap php

Backend uygulama, kullanıcıların dosya upload ve önyüz için bunları yayınlamak. (- Sayılar yinelenen adları üzerine eklenebilir yani Meaningful_filename.docx yerine a4b25e9f48cfb6268f34b691fc18cd76fefe96b5.docx arasında) sfWidgetFormInputFile ve sfValidatorFile kullanarak, orijinal dosya yerine rastgele bir dize varsayılan işlevselliğini tutmak istiyorum. Kullanıcının birkaç dosyaları indirir ve dosya adı ayırmanız mümkün olmaz nerede bu senaryolarda yararlı olabilir.

$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.'
));

Özgün işlevleri sfWidgetFormInputFile widget var mı yoksa bu başka bir çözüm var mı?

3 Cevap

Sen arayarak dosyayı almak $form["file_name"]->getValue(). Bu size class sfValidatedFile where you can call the method getOriginalName() bir nesne verir.


To define how the file should be save you can do this: The sfValidatorFile class accepts an option which sfValidatedFile class to use:

validated_file_class: temizlenmiş yüklenen dosyayı (isteğe bağlı) yöneten sınıfın adı

sfValidatedFile sınıf bir yöntemini çağıran bir yöntemi save var generateFileName. Bu sınıf, alt sınıf ve bu yöntemi üzerine yazmak:

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;
    }
}

Burada orijinal sınıfından fonksiyonudur:

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

Sonra Validator bu şekilde ayarlayın:

$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.')
);

Umarım ki olur!

Biraz araştırma yaptıktan sonra:

Eğer sfValidatedFile genişletmek ve generateFilename kılabilirsiniz ederken ben sfFormPropel dosyayı isim modeli için sütun adı dayalı bir yöntemin varlığını denetler öğrendim.

Symfony / plugins / sfPropelPlugin / lib / form hattı 292 Gönderen:

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

Sütun file_name denir nedenle, yöntem, biçim sınıfta generateFileNameFilename varlığını arar. Bu şekilde sadece çok sfValidatedFile widget'ı uzanan daha, form sınıfına bir yöntem eklemek gerekir. Örneğin, benim işlevi alınmaz, aksi takdirde bir ardışık sayı (bir yöntem yinelemeli oluşturulan dosya kontrol etmektir) ekler orijinal adını kullanır:

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;
    }
 }

Ben bazı bulmak için kod tabanı arıyor aldı neden olduğu her yerde symfony API bu belgelenmiş bulamıyorum. Birçok yerde bu yöntemi kullanıyorsanız, uzanan sfValidatedFile çok iyi bir seçenek olabilir.

Symfony belgelerine göre "sfValidatorFile validator validator sfValidatedFile sınıfının bir örneğine yüklenen dosyayı dönüştürür. Yüklenen bir dosyayı doğrular, ya da validated_file_class seçeneği ayarlı ise." (Kaynak: http://www.symfony-project.org/forms/1_4/en/B-Validators#chapter_b_sub_sfvalidatorfile)

SfValidatedFile sınıf doğru dışarı kutunun dosyaları yeniden adlandırır rağmen, özel bir sınıf validated_file_class ayarlama ve sfValidatedFile genişleterek bu işlevi geçersiz kılabilirsiniz.

In your custom validated file class, pass your custom filename to the save() method. "If you don't pass a file name, it will be generated by the generateFilename method." (Source: http://www.symfony-project.org/api/1_4/sfValidatedFile#method_save)

İşte bunu verebilecek tek yolu (Kaynak: http://forum.symfony-project.org/index.php/m/90887/#msg_90887) ...

Özel bir valide dosya sınıfı:

// 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);
  }
}

SfWidgetFormInputFile için 'validated_file_class' => 'myValidatedFile' ayarlamak için emin olun. Ve dosya adı form'ın tasarruf yöntemi olacak ne mantığı ayarlamak için.