Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je suis en plein dans l'upload de fichier et me heurte à un problème.
Je souhaite que l'envoie d'un fichier soit contrôlé, et je souhaiterai donc appliquer des filtres sur le fichier de destination.
Voici à quoi ressemble la méthode "receive" de cet Adapter : (juste pour information)
public function receive($files = null) { if (!$this->isValid($files)) { return false; } $check = $this->_getFiles($files); foreach ($check as $file => $content) { if (!$content['received']) { $directory = ''; $destination = $this->getDestination($file); if ($destination !== null) { $directory = $destination . DIRECTORY_SEPARATOR; } $filename = $directory . $content['name']; $rename = $this->getFilter('Rename'); if ($rename !== null) { $tmp = $rename->getNewName($content['tmp_name']); if ($tmp != $content['tmp_name']) { $filename = $tmp; } if (dirname($filename) == '.') { $filename = $directory . $filename; } $key = array_search(get_class($rename), $this->_files[$file]['filters']); unset($this->_files[$file]['filters'][$key]); } // Should never return false when it's tested by the upload validator if (!move_uploaded_file($content['tmp_name'], $filename)) { if ($content['options']['ignoreNoFile']) { $this->_files[$file]['received'] = true; $this->_files[$file]['filtered'] = true; continue; } $this->_files[$file]['received'] = false; return false; } if ($rename !== null) { $this->_files[$file]['destination'] = dirname($filename); $this->_files[$file]['name'] = basename($filename); } $this->_files[$file]['tmp_name'] = $filename; $this->_files[$file]['received'] = true; } if (!$content['filtered']) { if (!$this->_filter($file)) { $this->_files[$file]['filtered'] = false; return false; } $this->_files[$file]['filtered'] = true; } } return true; }
On peut remarquer que les filtres sont appliqués après la fonction "move_uploaded_file", sauf pour un éventuel filtre "Raname".
Première remarque :
Ne serait-il pas logique que les filtres soit appliqués sur le "$filename" avant la fonction "move_uploaded_file" ?
- par exemple, je veux mettre un filtre qui change (différent de "renommer") le fichier dans le cas où celui-ci aurait le même nom qu'un fichier présent dans le répertoire de destination (ce qui peut fortement arriver).
Seconde remarque :
De plus, en examinant ce bout de code :
$filename = $directory . $content['name']; $rename = $this->getFilter('Rename'); if ($rename !== null) { $tmp = $rename->getNewName($content['tmp_name']); if ($tmp != $content['tmp_name']) { $filename = $tmp; } if (dirname($filename) == '.') { $filename = $directory . $filename; } $key = array_search(get_class($rename), $this->_files[$file]['filters']); unset($this->_files[$file]['filters'][$key]); }
On remarque qu'il compare la valeur temporaire ($tmp) au nom temporaire du fichier ($content['tmp_name']). Ce qui n'est pas logique me semble t-il, il devrait être comparé à "$filename".
Donc je souhaiterai mieux comprendre tout ce fonctionnement. Est-ce des bugs, ou j'ai mal compris comment fonctionne le truc ?
Hors ligne