web-dev-qa-db-fra.com

Écraser le fichier lors du téléchargement s'il existe

J'utilise un composant/plugin multiupload pour Joomla/VM, j'ai déjà modifié le code pour l'empêcher de renommer des fichiers (car les noms de mes images de produit contiennent le nom du produit et son sku). Cependant, si le fichier existe déjà dans le dossier images, le fichier est suffixé de (1). Je voudrais écraser le fichier s'il porte le même nom ou le supprimer avant de le télécharger. Je pense avoir trouvé la fonction dans le composant qui le fait, mais je suis relativement nouveau dans ce domaine et je ne suis pas sûr de la partie de code que je dois modifier? Voici la fonction:

protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
        $index = null, $content_range = null) {
        $file = new stdClass();
        $file->name = $this->get_file_name($name, $type, $index, $content_range);
        $file->size = $this->fix_integer_overflow(intval($size));
        $file->type = $type;
        if ($this->validate($uploaded_file, $file, $error, $index)) {
            $this->handle_form_data($file, $index);
            $upload_dir = $this->get_upload_path();
            if (!is_dir($upload_dir)) {
                mkdir($upload_dir, $this->options['mkdir_mode'], true);
            }
            $file_path = $this->get_upload_path($file->name);
            $append_file = $content_range && is_file($file_path) &&
                $file->size > $this->get_file_size($file_path);
            if ($uploaded_file && is_uploaded_file($uploaded_file)) {
                // multipart/formdata uploads (POST method uploads)
                if ($append_file) {
                    file_put_contents(
                        $file_path,
                        fopen($uploaded_file, 'r'),
                        FILE_APPEND
                    );
                } else {
                    move_uploaded_file($uploaded_file, $file_path);
                }
            } else {
                // Non-multipart uploads (PUT method support)
                file_put_contents(
                    $file_path,
                    fopen('php://input', 'r'),
                    $append_file ? FILE_APPEND : 0
                );
            }
            $file_size = $this->get_file_size($file_path, $append_file);
            if ($file_size === $file->size) {
                $file->url = $this->get_download_url($file->name);
                list($img_width, $img_height) = @getimagesize($file_path);
                if (is_int($img_width) &&
                        preg_match($this->options['inline_file_types'], $file->name)) {
                    $this->handle_image_file($file_path, $file);
                }
            } else {
                $file->size = $file_size;
                if (!$content_range && $this->options['discard_aborted_uploads']) {
                    unlink($file_path);
                    $file->error = 'abort';
                }
            }
            $this->set_additional_file_properties($file);
        }
        return $file;
    }

$ name contient le nom de fichier de l'image à télécharger. Toute aide serait appréciée.

Cordialement Donna

Edit: Voici les 2 fonctions supplémentaires.

protected function get_upload_path($file_name = null, $version = null) {
    $file_name = $file_name ? $file_name : '';
    if (empty($version)) {
        $version_path = '';
    } else {
        $version_dir = @$this->options['image_versions'][$version]['upload_dir'];
        if ($version_dir) {
            return $version_dir.$this->get_user_path().$file_name;
        }
        $version_path = $version.'/';
    }
    return $this->options['upload_dir'].$this->get_user_path()
        .$version_path.$file_name;
}

et

 protected function validate($uploaded_file, $file, $error, $index) {
        if ($error) {
            $file->error = $this->get_error_message($error);
            return false;
        }
        $content_length = $this->fix_integer_overflow(intval(
            $this->get_server_var('CONTENT_LENGTH')
        ));
        $post_max_size = $this->get_config_bytes(ini_get('post_max_size'));
        if ($post_max_size && ($content_length > $post_max_size)) {
            $file->error = $this->get_error_message('post_max_size');
            return false;
        }
        if (!preg_match($this->options['accept_file_types'], $file->name)) {
            $file->error = $this->get_error_message('accept_file_types');
            return false;
        }
        if ($uploaded_file && is_uploaded_file($uploaded_file)) {
            $file_size = $this->get_file_size($uploaded_file);
        } else {
            $file_size = $content_length;
        }
        if ($this->options['max_file_size'] && (
                $file_size > $this->options['max_file_size'] ||
                $file->size > $this->options['max_file_size'])
            ) {
            $file->error = $this->get_error_message('max_file_size');
            return false;
        }
        if ($this->options['min_file_size'] &&
            $file_size < $this->options['min_file_size']) {
            $file->error = $this->get_error_message('min_file_size');
            return false;
        }
        if (is_int($this->options['max_number_of_files']) && (
                $this->count_file_objects() >= $this->options['max_number_of_files'])
            ) {
            $file->error = $this->get_error_message('max_number_of_files');
            return false;
        }
        list($img_width, $img_height) = @getimagesize($uploaded_file);
        if (is_int($img_width)) {
            if ($this->options['max_width'] && $img_width > $this->options['max_width']) {
                $file->error = $this->get_error_message('max_width');
                return false;
            }
            if ($this->options['max_height'] && $img_height > $this->options['max_height']) {
                $file->error = $this->get_error_message('max_height');
                return false;
            }
            if ($this->options['min_width'] && $img_width < $this->options['min_width']) {
                $file->error = $this->get_error_message('min_width');
                return false;
            }
            if ($this->options['min_height'] && $img_height < $this->options['min_height']) {
                $file->error = $this->get_error_message('min_height');
                return false;
            }
        }
        return true;
    }

Edit 2: J'ai essayé d'ajouter un file_exists () à la fonction handle_file_upload: // Vérifiez si le fichier existe $ exist_file = $ file_path. $ Upload_file; if file_exists ($ exist_file) {unlink ($ exist_file); }

Mais les fichiers ne téléchargent pas du tout. J'ai passé des heures sur ce sujet et je n'ai vraiment aucune idée.

1
Dtorr1981

Si j'interprète correctement ce que le développeur a fait ici, cela peut fonctionner pour vous. Ces modifications doivent être effectuées dans le premier code que vous avez posté.

Ajoutez ce code:

jimport('joomla.filesystem.file');

Avant ce code:

$file = new stdClass();

Et ajoutez ce code:

$append_file = false;

Après ce code:

$append_file = $content_range && is_file($file_path) &&
            $file->size > $this->get_file_size($file_path);

Ajoutez ensuite ceci:

if(is_file($file_path)){
    JFile::delete($file_path);
}

Avant ça:

move_uploaded_file($uploaded_file, $file_path);
2
Terry Carter