it-swarm.com.de

Datei beim Hochladen überschreiben, wenn Datei vorhanden ist

Ich verwende eine Multiupload-Komponente/ein Plugin für Joomla/VM. Ich habe den Code bereits geändert, um zu verhindern, dass Dateien umbenannt werden (da meine Produkt-Image-Namen den Produktnamen und die Artikelnummer enthalten). Wenn die Datei jedoch bereits im Bilderordner vorhanden ist, wird der Datei das Suffix (1) hinzugefügt. Ich möchte die Datei überschreiben, wenn sie denselben Namen hat, oder sie vor dem Hochladen löschen. Ich denke, ich habe die Funktion in der Komponente gefunden, die dies tut, aber ich bin relativ neu in dieser und ich bin nicht sicher, welchen Teil des Codes ich ändern muss? Hier ist die Funktion:

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 enthält den Dateinamen des hochzuladenden Bildes. Jede Hilfe wäre sehr dankbar.

Beste Grüße Donna

Bearbeiten: Hier sind die 2 zusätzlichen Funktionen.

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;
}

und

 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: Ich habe versucht, der handle_file_upload-Funktion file_exists () hinzuzufügen: // Prüfe, ob die Datei existiert $ exist_file = $ file_path. $ Uploaded_file; if file_exists ($ exist_file) {Verknüpfung aufheben ($ exist_file); }

Die Dateien werden jedoch überhaupt nicht hochgeladen. Ich habe Stunden damit verbracht und ich habe wirklich keine Ahnung.

1
Dtorr1981

Wenn ich interpretiere, was der Entwickler hier richtig gemacht hat, funktioniert dies möglicherweise für Sie. Diese Änderungen sollten im ersten von Ihnen veröffentlichten Code vorgenommen werden.

Füge diesen Code hinzu:

jimport('joomla.filesystem.file');

Vor diesem Code:

$file = new stdClass();

Und fügen Sie diesen Code hinzu:

$append_file = false;

Nach diesem Code:

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

Dann füge folgendes hinzu:

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

Vor dem:

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