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