Использовать PHP ZipArchive с файлом в качестве переменной
В контроллере Symfony у меня есть файл (объект UploadedFile) в качестве переменной.
Я хочу открыть эту "переменную" с помощью php ZipArchive и извлечь ее. Но методы open() ожидают строку, которая является именем файла в файловой системе. Есть ли способ обработать файл с помощью ZipArchive и без записи файловой переменной в ФС?
2 ответа
Вы можете использовать tmpfile() для создания временного файла, записи в него, а затем использовать его в zip. Пример:
<?php
$zip = new ZipArchive();
$zip->open(__DIR__ . '/zipfile.zip', ZipArchive::CREATE);
$fp = tmpfile();
fwrite($fp, 'Test');
$filename = stream_get_meta_data($fp)['uri'];
$zip->addFile($filename, 'filename.txt');
$zip->close();
fclose($fp);
Немного улучшить:
$zipContent; // in this variable could be ZIP, DOCX, XLSX etc.
$fp = tmpfile();
fwrite($fp, $zipContent);
$stream = stream_get_meta_data($fp);
$filename = $stream['uri'];
$zip = new ZipArchive();
$zip->open($filename);
// profit!
$zip->close();
fclose($fp);
Просто не имеет смысла создавать "zipfile.zip" и добавлять файл внутрь, потому что у нас уже есть переменная.
Посмотрите этот ответ на /questions/4257327/php-peredaet-soderzhimoe-fajla-v-funktsiyu-kotoraya-ozhidaet-imya-fajla/4257335#4257335
Есть способ создать файл, который находится только в памяти.