BrownieCoffee
4 months ago
362
1
Laravel

Delete unused images summernote

Posted 4 months ago by BrownieCoffee

Hi there, it's me again.

I would like to delete unused images saved in the server.

  protected function getUrlToImage()
    {

        libxml_use_internal_errors(true);

        //je crée un nouveau document
        $dom = new \DomDocument();

        //je charge les données en précisant de désactiver l'ajout automatique d'éléments implicites html / body  (LIBXML_HTML_NOIMPLIED) et d'empêcher l'ajout d'un doctype par défaut lorsqu'il n'est pas trouvé.
        $dom->loadHtml($this->content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

        // je viens stoket l'image dans une variable
        $images = $dom->getElementsByTagName('img');

        //  pour chaque <img> dans le champs summernote
        foreach ($images as $key => $image) {
            // je récupère l'attribut 'src' que je vais stoker dans la variable
            $data = $image->getAttribute('src');

            //si la source de l'image est 'data-url'
            if (preg_match('/data:image/', $data)) {
                // je récupère le mimetype
                preg_match('/data:image\/(?<mime>.*?)\;/', $data, $groups);
                $mimeType = $groups['mime'];

                $imageName = gmdate('d_m_Y_h_i_s') . '.' . $mimeType;
                // je stocke le pseudonyme de l'utilisateur dans la variable
                $userFolder = $this->user->username;
                //je stoke le chemin du dossier que je vais créer par la suite dans une variable
                $this->storagePath = 'projets/' . $userFolder;

                $path =  $this->storagePath . '/' . $imageName;

                //si le dossier n'existe pas, je le crée
                if (!Storage::exists($this->storagePath)) {

                    // je convertis la  base64 en image 
                    $img = Image::make($data)
                        ->encode($mimeType, 100);

                    // je la télécharge dans le disque public  
                    Storage::disk('public')->put($path, $img);
                }


                //     //je retire l'attribut à l'image...
                $image->removeAttribute('src');
                //...et je lui attribut le nouvel attribut
                $image->setAttribute('src', "/storage/{$path}");

// -------------ADDED CODE -------------//

                $links = array();
                $path = $this->storagePath;
                $files = glob($path);
                for ($i = 0; $i < $images->length; $i++) {
                    $links[] = $images->item($i)->getAttribute("src");
                }
                $result = array_diff($files, $links);
                dd($result);
                foreach ($result as $deleteFile) {
                    if (file_exists($deleteFile)) {
                        array_map('unlink', glob($deleteFile));
                    }
                }

// -------------END ADDED CODE -------------//

            }
        }

I would like to try this code but I don't know how it really works. I'm confused. Do you have any solutions to delete the project unused files on the server ?

Thank you in advance. See you.

Please sign in or create an account to participate in this conversation.