Использовать 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

Есть способ создать файл, который находится только в памяти.

Другие вопросы по тегам