Comment puis-je conserver le nom de fichier d'origine après le téléchargement dans Symfony
Les utilisateurs de l'application backend peut télécharger des fichiers et de les publier sur le frontend. À l'aide de sfWidgetFormInputFile et sfValidatorFile, je tiens à garder le nom de fichier d'origine au lieu de la fonctionnalité par défaut d'une chaîne de caractères aléatoires (c'est à dire Meaningful_filename.docx au lieu de a4b25e9f48cfb6268f34b691fc18cd76fefe96b5.docx - les nombres peuvent être ajoutés sur les noms en double). Cela peut être utile dans le cas où l'utilisateur télécharge plusieurs fichiers et ne serait pas en mesure de les distinguer à partir du nom de fichier.
$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.'
));
Est-il une fonctionnalité native dans le sfWidgetFormInputFile widget ou est-il une autre solution?
source d'informationauteur markb
Vous devez vous connecter pour publier un commentaire.
Vous obtenez le fichier en appelant
$form["file_name"]->getValue()
. Cela vous donne un objet de la classesfValidatedFile
où vous pouvez appeler la méthodegetOriginalName()
.Pour définir la façon dont le fichier doit être enregistrer, vous pouvez faire ceci:
Le
sfValidatorFile
classe accepte une option quisfValidatedFile
classe à utiliser:La
sfValidatedFile
classe a une méthodesave
qui appelle une méthodegenerateFileName
. Sous-classe de cette classe et de remplacer cette méthode:Ici est la fonction de la classe d'origine:
Alors vous configurez le programme de validation de cette façon:
Espère que ça aide!
Après quelques recherches:
Alors que vous pouvez étendre sfValidatedFile et remplacer generateFilename j'ai trouvé que sfFormPropel vérifie l'existence d'une méthode basée sur le nom de la colonne pour le modèle de nom de fichier.
De symfony/plugins/sfPropelPlugin/lib/forme de la ligne 292:
Par conséquent, si votre colonne est appelée file_name, la méthode ressemble de l'existence de generateFileNameFilename dans la classe de formulaire. De cette façon, vous n'avez qu'à ajouter une méthode à votre formulaire de classe, plutôt que de prolonger la sfValidatedFile widget. Par exemple, ma fonction utilise le nom d'origine si elle n'est pas prise, sinon ajoute un numéro séquentiel (une méthode récursive de vérifier le nom de fichier généré):
Je ne trouve pas cette documenté dans l'API en ligne de symfony n'importe où qui est pourquoi il a fallu un peu chercher la base de code à trouver. Si vous utilisez cette méthode dans de nombreux endroits, l'extension de sfValidatedFile peut être une bonne option aussi.
Selon la documentation Symfony "La sfValidatorFile programme de validation valide d'un fichier téléchargé. Le validateur convertit le fichier téléchargé en une instance de la sfValidatedFile de classe, ou de la validated_file_class option si elle est définie." (Source: http://www.symfony-project.org/forms/1_4/en/B-Validators#chapter_b_sub_sfvalidatorfile)
Bien que le sfValidatedFile classe renomme les fichiers, tout droit sorti de la boîte, vous pouvez annuler cette fonction en définissant la validated_file_class à une classe personnalisée, et l'extension de sfValidatedFile.
Dans votre personnalisé validé fichier de classe, passez votre nom de fichier personnalisé à la méthode save (). "Si vous ne passez pas d'un nom de fichier, il sera généré par le generateFilename méthode." (Source:
http://www.symfony-project.org/api/1_4/sfValidatedFile#method_save)
Voici une façon pour vous de le faire (Source: http://forum.symfony-project.org/index.php/m/90887/#msg_90887)...
Personnalisé validé fichier de classe:
Assurez-vous de définir
'validated_file_class' => 'myValidatedFile'
pour la sfWidgetFormInputFile. Et de définir la logique de ce que le nom de fichier va être dans la Forme de la méthode de sauvegarde.