#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 Вы должны отметить это как принятый ответ, если это действительно решило проблему.