Распаковка ZIP
Загрузка ZIP-архива, предпросмотр и извлечение файлов с возможностью отдельного скачивания или массовой распаковки
Перетащите ZIP-файл сюда или нажмите для выбора
Поддерживаются архивные файлы формата .zip
Что такое распаковка ZIP?
Распаковка ZIP открывает архив и восстанавливает файлы, сохраненные внутри. Она полезна, когда вы получили сжатый пакет, хотите посмотреть содержимое перед скачиванием всего набора, нужен только один файл или нужно проверить имена и размеры перед доверием к архиву. Для обычных файлов ZIP является форматом без потерь, и извлеченное содержимое должно совпадать с исходным. Но распаковка не делает неизвестные файлы безопасными. Архив может содержать вводящие в заблуждение имена, неожиданные папки, данные, сильно увеличивающиеся после распаковки, или исполняемые файлы, которые нельзя открывать без проверки. Этот браузерный инструмент читает архив локально и позволяет скачать выбранные файлы, но не заменяет проверку безопасности подозрительных архивов.
Как использовать
Как использовать
- Перетащите ZIP-файл в область загрузки или нажмите кнопку «Выбрать ZIP-файл»
- Просмотрите список файлов и сведения о них в архиве
- Нажмите «Скачать» для нужного файла, чтобы извлечь его
- Нажмите «Извлечь всё», чтобы скачать все файлы одним ZIP-архивом
Безопасность при извлечении
- Перед скачиванием извлечённых файлов просмотрите их список, особенно если архив получен из ненадёжного источника.
- Будьте осторожны с исполняемыми файлами, вложенными архивами и подозрительными именами.
Применение
Технический принцип
Чтение ZIP-архива выполняется в порядке, обратном записи. Браузер получает файл как `ArrayBuffer` через File API (`file.arrayBuffer()`), и ридер сканирует файл с конца в поисках сигнатуры End of Central Directory `0x06054b50` (PK\x05\x06). EOCD занимает не более 22 байт плюс необязательный комментарий до 65 535 байт, поэтому окно сканирования ограничено. EOCD указывает на смещение и размер центрального каталога, который содержит один File Header (`0x02014b50`) для каждой записи. Каждый File Header включает сжатый и несжатый размеры, CRC-32, метод сжатия, имя файла и смещение соответствующего Local File Header (`0x04034b50`). Ридер может затем перейти непосредственно к любой отдельной записи, не разбирая предыдущие — именно поэтому извлечение одного файла из многогигабайтной резервной копии выполняется быстро. Распаковка зависит от байта метода: `0x00` — хранение (без сжатия, просто memcpy), `0x08` — DEFLATE согласно RFC 1951 (~99% архивов в реальности), `0x0C` — BZIP2, `0x0E` — LZMA, `0x5D` — устаревший PPMd. Этот инструмент использует JSZip (или fflate для более высокой производительности — `unzipSync` от fflate декодирует типичный 10 МБ DEFLATE-архив за десятки миллисекунд, в несколько раз быстрее JSZip). После распаковки CRC-32 сырых байт пересчитывается и сравнивается со значением из центрального каталога; несовпадение указывает на повреждение или подделку. Два аспекта безопасности важны для любого кода извлечения. Первый — уязвимость Zip Slip (Snyk, 2018): вредоносный архив может содержать записи с последовательностями обхода путей вроде `../../etc/passwd`, и простой экстрактор, объединяющий имя записи с целевой директорией, запишет данные за пределы предполагаемой песочницы. Исправление — нормализовать объединённый путь с помощью `path.resolve()` и проверить, что он по-прежнему начинается с целевой директории перед записью. Этот инструмент предлагает каждую запись как отдельную загрузку браузера через `URL.createObjectURL(new Blob([bytes]))`, и браузер изолирует место назначения, поэтому обход директорий не может выйти за пределы папки загрузок пользователя, но тот же архив на серверном экстракторе был бы уязвим. Во-вторых, зашифрованные архивы не поддерживаются: традиционный ZipCrypto — это 32-битный потоковый шифр, который легко взламывается атакой с известным открытым текстом за три байта, а современный WinZip AES-256 (PKWARE APPNOTE 7.0) требует дополнительного поля AE-2 с аутентификацией HMAC-SHA1 — ни один из вариантов здесь не реализован. Архивы свыше 4 ГБ опираются на расширение ZIP64 с дополнительными полями для 64-битных размеров и смещений, которые парсер должен читать вместо 32-битных полей центрального каталога.
- Порядок разбора: сканирование с конца файла в поисках сигнатуры EOCD `0x06054b50` (максимум 22 + 65535 байт от конца) → переход к центральному каталогу → переход к каждому Local File Header.
- Методы сжатия: `0x00` хранение, `0x08` DEFLATE (RFC 1951, ~99% архивов), `0x0C` BZIP2, `0x0E` LZMA, `0x5D` PPMd.
- Целостность: CRC-32 с полиномом `0xEDB88320` (инверсия IEEE 802.3) пересчитывается для извлечённых байт и сравнивается со значением из центрального каталога.
- Zip Slip (Snyk 2018): записи с обходом пути `../` могут записать данные за пределы директории извлечения; исправляется нормализацией и проверкой результирующего пути перед записью.
- Реализация в браузере: `File.arrayBuffer()` → JSZip / fflate `unzipSync()` → для каждой записи `URL.createObjectURL(new Blob([bytes]))` для загрузки, без обращения к серверу.
- Шифрование не поддерживается: ZipCrypto взламывается за 3 байта известного открытого текста; WinZip AES-256 (APPNOTE 7.0, дополнительное поле AE-2 с HMAC-SHA1) не реализован.
- ZIP64 (APPNOTE 4.5+) расширяет 32-битные поля размера/смещения до 64-битных через дополнительные поля; требуется для архивов или отдельных записей свыше 4 ГБ (2³² − 1 байт).
Примеры
Просмотр содержимого архива
Просматривайте список файлов внутри ZIP-архива прямо в браузере без установки программ для распаковкиИзвлечение отдельных файлов
Скачивайте только нужный файл из архива, не извлекая всё содержимоеПакетное извлечение
Извлекайте и скачивайте все файлы из архива одним кликомЧасто задаваемые вопросы
Загружается ли ZIP на сервер для распаковки?
Нет. Страница читает ZIP локально через FileReader API и распаковывает записи прямо в браузере с помощью JSZip. Файлы не покидают ваше устройство. Это можно проверить во вкладке Network во время распаковки.
Какие варианты ZIP поддерживаются?
Стандартные ZIP-файлы со сжатием DEFLATE (самый распространённый вариант). Записи без сжатия (Stored) тоже работают. ZIP64 (для архивов больше 4 ГБ) поддерживается в большинстве сборок. Зашифрованные записи (защищённые паролем), а также 7Z, RAR и TAR не поддерживаются — для них используйте профильный инструмент.
Можно ли распаковать ZIP с паролем?
Как правило, нет. JSZip не работает с записями, зашифрованными ZipCrypto или AES. Сначала расшифруйте архив через 7-Zip или WinRAR на десктопе, а затем при необходимости снова упакуйте и загрузите сюда, чтобы посмотреть структуру.
Что если в ZIP китайские или японские имена файлов?
По умолчанию страница читает имена файлов как UTF-8. Старые ZIP, созданные в Windows, могут хранить имена в GBK (китайский) или Shift_JIS (японский) без флага UTF-8 — они отобразятся как кракозябры. Пересоздайте архив инструментом с поддержкой UTF-8 или используйте 7-Zip на десктопе с правильной кодовой страницей.
Каков предел размера файла?
Память браузера. Современные десктопы тянут ZIP в 1+ ГБ; мобильные браузеры заканчивают память на нескольких сотнях мегабайт. Для очень больших архивов используйте десктопный инструмент, который стримит данные с диска.
Можно ли посмотреть содержимое файла без распаковки?
Да, для текстовых файлов — кликните по записи, и страница покажет её содержимое. Изображения отображаются миниатюрами. Для бинарных записей (исполняемых файлов, вложенных ZIP) показываются только метаданные; для просмотра скачайте.
Извлекаются ли скрытые файлы и dotfiles?
Да. В ZIP нет понятия атрибута «скрытый» — все записи видны. Имена, начинающиеся с точки (.gitignore, .env), извлекаются как обычно; работайте с ними как с обычными файлами.