|Решено| PHP Чтение файла из архива с ошибкой

Решил написать простую веб морду для своих дел. Надо было прочитать один файл из zip архива и отдать его на скачивание. Перепробовав несколько вариантов открытия файлов и/или zip архивов я заметил, что xml бьется при таком чтении и последующей загрузке.

Ожидается: <title-info> Происходит: &lt;title-info&gt; То есть в какой-то момент времени XML файл обрабатывается как HTML? Или проблемы в кодировке?

Достаёт и отдаёт файл этот код:

$zip = new ZipArchive;
if ($zip->open("PATH/$row[0]") === TRUE) {
    $file = $zip->getFromName("$downloadpole");
    $zip->close();
} else {
    echo 'Error';
}

header('Content-Disposition: attachment; filename=' . basename($downloadpole));
header('Content-Length: ' . filesize($file));

Где я ошибся и какой вариант будет работать лучше?


Ответы (1 шт):

Автор решения: Terrorka

Самым простым и логичным решением оказалась полная распаковка файла из архива в RAM диск с последующим чтением и удалением.

$zip = new ZipArchive();
$zip->open("PATH/archive_name");
$zip->extractTo("Z:/TEMP", array("file_name"));
$zip->close();
$path = "Z:/TEMP/file_name";
header ("Content-Type: xml");
header ("Content-Length: ".filesize($path));
header ("Content-Disposition: attachment; filename="file_name_var);
readfile($path);
unlink($path);

Вообще я изначально осознавал, что надо делать так, а не как иначе но по ряду причин сервер пришлось делать под windows где сделать ram disk чуть сложнее чем на unix системах. Видимо мой первый вариант с чтением и последующей отдачей не подходит для файлов которые могут повредится при чтении их в html.

Хотя я и боялся, что при полной распаковке файла в RAM возникнут сильные задержки но по итогу оказалось, что, по крайней мере, в моём случае (2Gb архивы с файлами по 1.5Mb) это работает достаточно бодро.

→ Ссылка