Как заархивировать файл с помощью symfony

#php #symfony #base64 #zip

#php #symfony #base64 #zip

Вопрос:

Я загрузил файл и хочу заархивировать его, а затем закодировать в base64. Загрузка идет хорошо. Но когда дело доходит до архивирования, я сталкиваюсь с ошибками. Вот мой контроллер

FileController.php

 <?php

namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentRoutingAnnotationRoute;
use AppEntityUpload;
use AppFormUploadType;
use DoctrineCommonPersistenceObjectManager;
use DoctrineORMEntityManagerInterface;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationFileExceptionFileException;
use SymfonyComponentHttpFoundationFileUploadedFile;
use SymfonyComponentStringSluggerSluggerInterface;

class FileController extends AbstractController
{
    /**
     * @Route("/home", name="accueil")
     */
    public function index(Request $request, EntityManagerInterface $manager, SluggerInterface $slugger)
    {

        $upload = new Upload();

        $form = $this->createForm(UploadType::class, $upload);

        $form->handleRequest($request);

        if($form->isSubmitted() amp;amp; $form->isValid()) {
            $manager->persist($upload);
            $manager->flush();


            $uploadedFile = $form->get('document')->getData();

            $originalFilename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME);
            $safeFilename = $slugger->slug($originalFilename);
            $newFilename = $safeFilename.'-'.uniqid().'.'.$uploadedFile->guessExtension();
            
            
            try {
                $uploadedFile->move(
                    $this->getParameter('upload_directory'),
                    $newFilename
                );
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
            }

            $zip = new ZipArchive();
            if ($zip->open('doc1.zip', ZipArchive::CREATE) == TRUE)
            {
                // Add files to the zip file
                $zip->addFile($uploadedFile);
             
                // All files are added, so close the zip file.
                $zip->close();
            }
            // Get the file and convert into string 
            $zip_f = file_get_contents('doc1.zip'); 
                  
            // Encode the zip file string data into base64 
            $data = base64_encode($zip_f);  
                
            // Display the output 
            echo $data; 


            $upload->setDocument($newFilename);
            return $this->redirectToRoute('accueil');

        }

        return $this->render('file/index.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

  

Это сообщение, которое я получаю при его запуске:

Попытался загрузить класс «ZipArchive» из пространства имен «App Controller». Вы забыли инструкцию «использовать» для другого пространства имен?

Комментарии:

1. ZipArchive::CREATE <- вы хотите ZipArchive::CREATE вместо этого, поскольку это класс, который принадлежит языку и существует в корневом пространстве имен , поэтому, поскольку вы находитесь в другом ( AppController ), вам нужно явно настроить на него таргетинг.

Ответ №1:

После завершения установки и проверки того, существует ли ваш класс ZipArchive с этим кодом

 var_dump(class_exists('ZipArchive')); 
  

если он возвращает true, вы просто добавляете

 use ZipArchive;
  

поместите его после вашего пространства имен
а затем поместите этот код

 $zip = new ZipArchive();
  

о том, где вы хотите поместить

Комментарии:

1. Это работает, но у меня новая ошибка. «Предупреждение: file_get_contents(doc1.zip ): не удалось открыть поток: нет такого файла или каталога»

2. @Orlinelekaneguetsa Вы должны отметить это как принятый ответ, если это действительно решило проблему.