Si le code que tu donnes ne fait bien parti que d'une seule fonction, il y a un problème, tu fais deux traitements différents des requêtes de formulaire :
if(!empty($this->request->data)){
Et :
if ( $this->request->is('put')) {
Étant donné que tu ne fais pas de redirection après le premier traitement, le second s'effectue également.
Ensuite, pourquoi est-ce que tu fais le traitement pour l'image dans la fonction du controller alors que tu en a déjà un dans le modèle ?
Un conseil, lorsque tu es en phase de développement, fais par exemple des debug au fur et à mesure des étapes de traitement, ce qui te permettra de situer l'origine des problèmes.
Qu'est-ce que c'est cette partie ?
else if(!empty($this->request->data['User']['avatar_file']['tmp_name'])) {
$this->Session->setFlash("Vous ne pouvez pas télécharger ce type de fichier");
}
Ce n'est pas logique, je ne vois pas le rapport entre la condition et le message d'erreur, surtout que tu as les règles de validations de ton modèle qui sont là pour retourner ce genre de message d'erreur.
Autre chose, ton champ en base de données, il se nomme avatar ou avatar_file ?
Car si lorsque tu fais une sauvegarde en base de données tu envoies avatar_file alors que ton champ se nomme avatar (ou inversement), c'est normal que la sauvegarde échoue.
Je te recommande fortement de visionner ce tutoriel : Tutoriel Vidéo CakePHP » Gérer l'upload de fichiers.