2010-01-25 16 views
14

Arka uç uygulamasındaki kullanıcılar dosyaları karşıya yükleyebilir ve ön yüze yayınlayabilirler. SfWidgetFormInputFile ve sfValidatorFile kullanarak, rasgele bir dizenin varsayılan işlevselliği yerine orijinal dosya adını tutmak istiyorum (yani, a4b25e9f48cfb6268f34b691fc18cd76fefe96b5.docx yerine Anlamlı_filename.docx - sayılar yinelenen adlara eklenebilir). Bu, kullanıcının birkaç dosyayı indirdiği ve dosya adından ayrı olarak söyleyemeyeceği senaryolarda yararlı olabilir. Orijinal Dosya Adını nasıl koruyabilirim Symfony uygulamasında yükledikten sonra

$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 widget'ta özgün işlevleri var mı yoksa orada buna başka bir çözüm mü?

cevap

22

Dosyayı $form["file_name"]->getValue() numaralı telefonu arayarak alabilirsiniz. Bu size getOriginalName() yöntemini çağırabileceğiniz sınıf sfValidatedFile nesnesinin bir nesnesini verir.


bunu yapabilirsin tasarruf dosya nasıl olması gerektiğini tanımlamak için:

validated_file_class: Adı yüklendi temizlenmiş yöneten sınıfın sfValidatorFile sınıf sfValidatedFile sınıf kullanma seçeneğini kabul

sfValidatedFile sınıfı (isteğe bağlı) bir dosya için bir yöntem generateFileName çağıran bir yöntem save sahiptir.

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

Umut yardımcı olur:

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

Sonra Validator bu şekilde ayarlayın: İşte
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; 
    } 
} 

orijinal sınıftan fonksiyonudur: Bu yöntemi bu sınıfını alt ve üzerine !

+3

Oldukça yaşlı ve çoğu insanın bunu anladığını biliyorum, ancak sorun yaşayanlar için sfValidatedFile'ı genişletmeniz gerektiğini unutmayın: "CustomValidatedFile sınıfı sfValidatedFile'ı genişletir", sadece kaydetmekle kalmaz. – Dandy

+0

@Dan: Sonunda kodu düzeltebileceğimi düşündüm. Sadece durumda;) Teşekkürler! –

1

Symfony belgelerine göre "The sfValidatorFile validator, yüklenen bir dosyayı doğrular. Doğrulayıcı, yüklenen dosyayı sfValidatedFile sınıfının bir örneğine veya ayarlanmışsa validated_file_class seçeneğine dönüştürür." (Kaynak:)

sfValidatedFile sınıfı dosyaları kutunun hemen dışına yeniden adlandırmasına rağmen, validated_file_class'ı özel bir sınıfa ayarlayarak ve sfValidatedFile'ı genişleterek bu işlevi geçersiz kılabilirsiniz.

Özelleştirilmiş dosya sınıfınızda, özel dosya adınızı save() yöntemine iletin. "Bir dosya adı geçmezseniz, generateFilename yöntemi tarafından oluşturulur." (Kaynak: http://www.symfony-project.org/api/1_4/sfValidatedFile#method_save)

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

Ö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 isminin Form kaydetme yönteminde ne olacağına dair mantığı ayarlamak için.Biraz araştırma sonra

+0

Bu örnekte özel sınıf var $ savedFilename öğesini nerede ayarlayabilirsiniz? – codecowboy

5

:

Eğer sfValidatedFile uzatmak ve öğrendiğim generateFilename geçersiz mümkün olmakla birlikte bu dosyayı adlandırmak için model için sütun adına dayanan bir yöntemin varlığını sfFormPropel denetler. symfony/plugins/sfPropelPlugin/lib/form hattı 292 Dan

: Sütun Dosya_adı çağrılıp çağrılmadığını

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

nedenle, yöntem, biçim sınıfında generateFileNameFilename varlığı arar. Bu şekilde, sfValidatedFile widget'ını genişletmek yerine, form sınıfınıza yalnızca bir yöntem eklemeniz gerekir.

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

Bu symfony API belgelenen bulamıyor: Örneğin, benim işlevi aksi sıralı numara (bir yöntem yinelemeli oluşturulan dosya adını kontrol etmektir) ekler, bu alınmadığı takdirde orijinal adını kullanır Her yerde bu yüzden bazı bulmak için kod tabanı ararken aldı. Bu yöntemi birçok yerde kullanıyorsanız, sfValidatedFile öğesinin genişletilmesi de iyi bir seçenek olabilir.

+0

Yine Doctrine ile de geçerlidir. – neuromancer

İlgili konular