Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-01-2010 09:47:38

Blount
Membre
Date d'inscription: 23-06-2009
Messages: 98
Site web

Bug dans Zend_File_Transfer_Adapter_Http

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)

Code:

    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 :

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages