|Решено| PHP Чтение файла из архива с ошибкой
Решил написать простую веб морду для своих дел. Надо было прочитать один файл из zip архива и отдать его на скачивание. Перепробовав несколько вариантов открытия файлов и/или zip архивов я заметил, что xml бьется при таком чтении и последующей загрузке.
Ожидается:
<title-info>
Происходит:
<title-info>
То есть в какой-то момент времени 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 шт):
Самым простым и логичным решением оказалась полная распаковка файла из архива в 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) это работает достаточно бодро.