За последние 24 часа нас посетил 20181 программист и 1004 робота. Сейчас ищут 287 программистов ...

Проблема с распаковкой архива, получаемого из потока

Тема в разделе "PHP для профи", создана пользователем Deonis, 17 апр 2020.

Метки:
  1. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Всем привет.
    Получаю архив из 1С. Сохраняю архив. Без лишней воды, примерно так:
    PHP:
    1. <?php
    2. private function uploadFile($filename) {
    3.     $fr = fopen('php://input', 'r');
    4.     $fp = fopen($this->DIR_ARCHIVE. $filename, 'w');
    5.     stream_copy_to_stream($fr, $fp);
    6.     fclose($fr);
    7.     return fclose($fp);
    8. }
    Если метод вернул true, то запускаю распаковку
    PHP:
    1. <?php
    2. private function unzipArchive($filename) {
    3.   $filepath = $this->DIR_ARCHIVE . $filename;
    4.   if ($this->isValidZip($filepath)) {
    5.     $output = $this->DIR_PROGRESS . pathinfo($filename, PATHINFO_FILENAME);
    6.     $zip = new \ZipArchive;
    7.     if ($zip->open($filepath) === true) {
    8.       $success = $zip->extractTo($output); // тут затык
    9.       if ($zip->close() && $success) {
    10.         return $output;
    11.       }
    12.     }
    13.   }
    14.   return false;
    15. }
    Метод extractTo() возвращает false. Если запустить запрос повторно без передачи файла, когда предыдущий архив остаётся лежать на сервере, то он распаковывается уже нормально. Такое ощущение, что файл не успевает записать все данные, когда начинает распаковку, но ведь PHP не асинхронный... В общем, слегка потерялся в догадках и буду рад каким-то предположениям.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    В общем, проблему нашел... Для метода extractTo(), в конце пути для извлечения файлов, важно указывать слеш, чего у меня не было.
     
    Sail нравится это.
  3. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Во всём виноваты линуксоиды.