Потоковый ZIP-файл не открывается в OSX - PullRequest
0 голосов
/ 28 июня 2011

Я создаю класс для потоковой передачи ZIP-файла из PHP.

Вывод абсолютно безупречен при открытии в WinRAR, сжатой папке Windows, BetterZip и т. Д., Но при открытии в OSX Unarchiver все, что я получаю, это файл .cpgz и ничего больше.

Я прочитал спецификацию ZIP снова и снова и проверил мои заголовки, и все выглядит хорошо. Здесь я нашел другой вопрос, который, похоже, имел ту же проблему, но решение состояло в том, чтобы изменить поле «версия, необходимая для извлечения», которое я сделал, на 0x0014, и я получаю ошибку «операция не разрешена» при попытке разархивировать.

Я загрузил образец zip-файла с папкой и небольшим изображением внутри:

http://www.freefilehosting.net/test_97

Вот как работает код:

// File entry header
echo pack('V', 0x04034b50);
echo pack('v', 0x0014); // Version needed to extract
echo pack('v', $dir ? 0 : 0x0808); // General purpose bit flag for unknown CRC
echo pack('v', 0x00); // Compression method (store)
echo pack('V', $dts); // DOS timestamp
echo pack('V', 0x00); // CRC - empty
echo pack('V', 0x00); // Compressed data length
echo pack('V', 0x00); // Decompressed data length
echo pack('v', strlen($filename)); // Length of filename
echo pack('v', 0x00); // Length of additional data

<snip>Output raw file data</snip>

// File entry trailer
echo pack('V', 0x08074b50); // Magic
echo pack('V', $crc); // CRC generated using crc32b algo
echo pack('V', $data_size); // Compressed size
echo pack('V', $total_size); // Uncompressed size

// CDR record
echo pack('V', 0x02014b50); // Magic
echo pack('v', 0x0014); // Version created by
echo pack('v', 0x0014); // Version req'd to open
echo pack('v', 0x00); // General purpose bit
echo pack('v', 0x00); // Compression method (store)
echo pack('V', $dts); // DOS timestamp
echo pack('V', $crc); // CRC of data
echo pack('V', $data_size); // Compressed size
echo pack('V', $total_size); // Uncompressed size
echo pack('v', strlen($filename)); // Filename length
echo pack('v', 0x00); // Extra data length
echo pack('v', 0x00); // Comment length
echo pack('v', 0x00); // Start disk no.
echo pack('v', 0x00); // Internal file attributes
echo pack('V', $dir ? 16 : 32); // External file attributes
echo pack('V', $offset); // Relative offset

// End of file record
echo pack('V', 0x06054b50); // Magic
echo pack('v', 0x00); // Current disk number
echo pack('v', 0x00); // Disk containing CDR
echo pack('v', $count); // Number of entries in this CDR
echo pack('v', $count); // Total number of CDR entries
echo pack('V', $cdr_len); // Length of CDR
echo pack('V', $cdr_offset); // Offset of CDR
echo pack('v', 0x00); // Zip file comment length

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Чтобы ответить на мой собственный вопрос, проблема в том, что OSX не любит 2 вещи. 1) Добавление дополнительных метаданных (размер, CRC и т. Д.) В конец записей каталога, так как это не является строго необходимым (но в рамках спецификации). И 2) он не поддерживает метод хранения 0x00 (хранилище), файлы должны быть как минимум DEFLATED, чтобы быть открытыми для разархиватора OSX.

0 голосов
/ 28 июня 2011

Интересно, что это не проблема с сервером / кодом ..

https://discussions.apple.com/thread/1446784?start=0&tstart=0

http://www.google.co.uk/#sclient=psy&hl=en&safe=off&biw=1436&bih=784&source=hp&q=cpgz&aq=f&aqi=g3g-s1g1&aql=&oq=&pbx=1&bav=on.2,or.r_gc.r_pw.&fp=c131ccfc5fe21e40

Проблема возникает у многих людей.

OSX не разархивирует его, сославшись на ошибку: операция не разрешена. Мне нужно было распаковать его вручную с помощью терминала.

Когда вы разархивируете с помощью терминала, не могли бы вы показать нам вывод?

unzip test.zip -d test

Shamil-Nunhucks-MacBook-Air: загружает shamil $ unzip test.zip -d test Архив: test.zip создание: тест / Тест / создание: тест / Тест / Новая папка / извлечение: тест / Тест / onebit_42.png

// Тема не должна быть здесь - перейти к суперпользователю?

=============================

Вам необходимо использовать:

ob_start('ob_gzhandler')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...