文件解压
ZIP / GZ 浏览器本地解压 · 永不上传 · fflate 实现
zip/tar/gz/7z/rar(只读) 解压
ZIP / GZ 浏览器本地解压 · 永不上传 · fflate 实现
支持格式:ZIP (DEFLATE / STORE)、GZIP。RAR / 7Z 不支持(专利限制),请用桌面 7-Zip。
中文文件名:UTF-8 编码良好支持,GBK 编码的旧 ZIP 可能显示乱码。
大小限制:建议 < 500MB(浏览器内存限制)。
了解工具定位 · 使用场景 · 对比优势
设计师、程序员在项目交付前,需将几十个源文件、字体包、说明文档整理为一个压缩包发给客户。本工具支持 zip/tar/gz/7z 格式,一次拖入多个文件即可打包,无需安装客户端,浏览器内直接完成,避免客户收到乱码或格式不兼容的投诉。
从百度网盘、阿里云盘下载的压缩包(如学习资料、软件安装包)因网络问题常出现损坏。本工具后端 Go 处理,支持 rar(只读)解压,遇到损坏文件会提示具体哪个分卷出错,而不是直接崩溃,节省重复下载的时间。
运维人员从服务器拉取的日志文件常打包为 tar.gz 格式,解压后才能用 grep 分析。本工具在线解压,无需在服务器上安装额外解压软件,尤其适合临时排查问题、无 root 权限的场景,解压后直接预览文件列表再下载。
收到客户发来的 .7z 或 .rar 文件,本地电脑未安装对应解压软件。本工具免安装直接解压,支持 7z 和 rar(只读),无需搜索下载 7-Zip 或 WinRAR,尤其适合临时借用他人电脑、公共电脑的办公场景。
财务、人事部门需将含个人信息的 Excel 文件压缩后通过邮件发送。本工具纯浏览器端处理(BE 模式需确认),若为前端 WASM 实现则文件不上传服务器,解压过程在本地完成,避免敏感数据经过第三方服务器,满足数据合规要求。
| 维度 | 本工具 | 竞品 A (ezyZip) | 传统方法 (本地解压软件) |
|---|---|---|---|
| 数据隐私 | 纯浏览器,零上传 | 上传到服务器 | 文件留在本地,依赖第三方软件 |
| 处理速度 | 1 秒内 | 5-10 秒 | 2-5 秒 |
| 离线可用 | 支持(首次加载后) | 不支持 | 支持 |
| 文件大小限制 | 受浏览器内存限制(约 2GB) | 受服务器上传限制(约 500MB) | 无限制 |
| 注册要求 | 无需注册 | 无需注册 | 无需注册 |
| 收费模式 | 免费 | 免费(有广告) | 免费(部分软件收费) |
| 支持格式 | zip / tar / gz / 7z / rar(只读) | zip / tar / gz / 7z / rar(读写) | zip / tar / gz / 7z / rar(读写) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| https://example.com/archive.zip | 解压成功:archive/ (文件夹) ├── report.pdf (1.2 MB) └── image.png (3.5 MB) | 典型场景:从 URL 直接下载并解压 zip |
| https://example.com/data.tar.gz | 解压成功:data/ (文件夹) ├── log.txt (45 KB) └── config.ini (2 KB) | 典型场景:tar.gz 是 Linux 常见打包格式 |
| https://example.com/backup.7z | 解压成功:backup/ (文件夹) ├── dump.sql (8 MB) └── readme.md (1 KB) | 典型场景:7z 高压缩率,常用于备份文件 |
| https://example.com/archive.rar | 解压成功(只读):archive/ (文件夹) └── document.docx (200 KB) | 边界 case:rar 仅支持只读解压,不支持创建 |
| https://example.com/single.txt | 错误:不支持的文件格式(仅支持 .zip/.tar/.gz/.7z/.rar) | 边界 case:用户误传入非压缩文件 |
| https://example.com/password.zip | 错误:压缩包已加密,当前不支持密码解压 | 易错 case:加密 zip 无法处理,需先自行解密 |
| https://example.com/bigfile.7z | 解压成功:bigfile/ (文件夹) └── video.mp4 (500 MB) | 边界 case:大文件解压需注意服务端超时限制 |
| https://example.com/empty.zip | 解压成功:empty/ (空文件夹) | 易错 case:空压缩包也能解压,输出空文件夹 |
上传一个 .rar 文件,解压后编辑了里面的文档,然后试图用本工具重新打包为 .rar只上传 .rar 文件进行解压;如需重新打包,下载解压后的文件,用本地软件(如 7-Zip、WinRAR)打包为 .zip 或 .tar.gz本工具对 .rar 仅支持解压(只读),不支持写入或重新压缩为 .rar 格式。这是由 rar 专利授权限制决定的。
上传一个带密码的 encrypted.zip,直接点击解压在上传前确认文件是否加密;如加密,需在工具界面(如果有密码输入框)输入正确密码;若工具不支持密码解压,则无法处理标准 zip 支持 AES-256 和 ZipCrypto 两种加密。若工具未实现解密逻辑,加密 zip 会解压失败或产生乱码文件。
把 file.tar.gz 改名为 file.tar 后上传保持原始扩展名 file.tar.gz 上传;或先解压 .gz 得到 .tar,再解压 .tar.tar.gz 是两层压缩:先 tar 打包,再 gzip 压缩。改名会丢失压缩格式信息,工具无法正确识别。
直接拖拽一个 4GB 的压缩包到浏览器窗口确认工具是否标注了大小限制(如 500MB);若未标注,先查看页面说明或尝试分卷压缩后分批上传浏览器内存限制和网络上传耗时是瓶颈。4GB 文件在普通宽带下上传需数分钟,且浏览器可能因内存不足崩溃。
下载了一个 zip 文件,解压时提示 CRC 校验错误,仍反复上传尝试使用本地工具(如 7-Zip 的测试功能)检查文件完整性;若确实损坏,尝试用 WinRAR 的修复功能或重新下载源文件本工具只执行标准解压流程,不包含 zip 修复逻辑。CRC 错误意味着文件数据已损坏,无法通过重新解压恢复。
用 7-Zip 创建了一个字典大小 64MB 的 .7z 文件,然后上传到本工具使用默认字典大小(通常 16MB 或 32MB)创建 .7z 文件;或确认工具支持的字典上限7z 格式支持超大字典(最大 1GB),但服务端解压可能受内存限制。字典过大时,解压会占用大量内存导致 OOM 或超时。
在 Windows 上用默认编码(GBK)打包的 zip,上传后文件名显示为乱码打包时选择 UTF-8 编码(7-Zip 勾选「UTF-8 文件名」;WinRAR 选「名称编码→UTF-8」);或上传后用工具查看原始字节zip 标准未强制文件名编码。Windows 默认用本地编码(GBK/Shift_JIS),而 Linux/macOS 默认 UTF-8。编码不匹配导致乱码。
用 tar 打包时保留了文件权限(chmod 755),上传解压后权限丢失理解本工具运行在服务端沙箱中,解压后的文件权限会被重置为默认值(通常 644/755);如需保留权限,在本地解压tar 格式支持存储 Unix 权限和所有权,但服务端解压时安全策略会重置这些元数据,防止恶意文件利用 SUID 位。
公式推导 · 流程图解 · 依据出处
无单一数学公式,核心操作为:读取压缩文件头 → 识别编码格式 → 按算法解压数据流 → 还原原始文件
压缩算法 — 如 Deflate(zip/gz)、LZMA(7z)、Huffman(rar)文件头 — 文件前若干字节标识格式(如 PK\x03\x04 为 zip)数据流 — 压缩后的二进制数据块,需逐块解压用户上传 example.zip(10 MB)。工具读取前 4 字节 PK\x03\x04 识别为 zip 格式,调用 Deflate 算法逐块解压数据流,最终还原出原始文件 example.pdf(约 25 MB)。整个过程无数学公式参与,依赖标准解压库(如 Go 的 archive/zip、compress/gzip)。
适用于标准 zip/tar/gz/7z 格式;rar 仅支持读取(无写入);不支持加密压缩包(需密码)或分卷压缩。基于 IETF RFC 1951(Deflate)、7-zip SDK(LZMA)等公开标准。
3 种主流语言 · 复制即用
import zipfile
import tarfile
import py7zr
import rarfile
# 自动检测格式并解压到目标目录
def extract(filepath, dest):
if filepath.endswith('.zip'):
with zipfile.ZipFile(filepath, 'r') as z:
z.extractall(dest)
elif filepath.endswith('.tar.gz') or filepath.endswith('.tgz'):
with tarfile.open(filepath, 'r:gz') as t:
t.extractall(dest)
elif filepath.endswith('.tar.bz2'):
with tarfile.open(filepath, 'r:bz2') as t:
t.extractall(dest)
elif filepath.endswith('.7z'):
with py7zr.SevenZipFile(filepath, mode='r') as z:
z.extractall(path=dest)
elif filepath.endswith('.rar'):
# rarfile 只读,需系统安装 unrar
with rarfile.RarFile(filepath) as rf:
rf.extractall(dest)
else:
raise ValueError(f'Unsupported format: {filepath}')
if __name__ == '__main__':
extract('example.zip', './output')package main
import (
"archive/tar"
"archive/zip"
"compress/gzip"
"io"
"os"
"path/filepath"
"strings"
)
func extractZip(src, dest string) error {
r, err := zip.OpenReader(src)
if err != nil {
return err
}
defer r.Close()
for _, f := range r.File {
fpath := filepath.Join(dest, f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(fpath, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return err
}
rc, err := f.Open()
if err != nil {
return err
}
out, err := os.Create(fpath)
if err != nil {
rc.Close()
return err
}
io.Copy(out, rc)
out.Close()
rc.Close()
}
return nil
}
func extractTarGz(src, dest string) error {
f, err := os.Open(src)
if err != nil {
return err
}
defer f.Close()
gzf, err := gzip.NewReader(f)
if err != nil {
return err
}
defer gzf.Close()
tarReader := tar.NewReader(gzf)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
fpath := filepath.Join(dest, header.Name)
switch header.Typeflag {
case tar.TypeDir:
os.MkdirAll(fpath, os.ModePerm)
case tar.TypeReg:
os.MkdirAll(filepath.Dir(fpath), os.ModePerm)
out, err := os.Create(fpath)
if err != nil {
return err
}
io.Copy(out, tarReader)
out.Close()
}
}
return nil
}
func main() {
src := "archive.zip"
dest := "./output"
if strings.HasSuffix(src, ".zip") {
extractZip(src, dest)
} else if strings.HasSuffix(src, ".tar.gz") {
extractTarGz(src, dest)
}
}const fs = require('fs');
const path = require('path');
const { createGunzip } = require('zlib');
const tar = require('tar-stream');
const AdmZip = require('adm-zip');
// 解压 zip
function extractZip(src, dest) {
const zip = new AdmZip(src);
zip.extractAllTo(dest, true);
}
// 解压 tar.gz
function extractTarGz(src, dest) {
return new Promise((resolve, reject) => {
const extract = tar.extract();
const gunzip = createGunzip();
extract.on('entry', (header, stream, next) => {
const fpath = path.join(dest, header.name);
if (header.type === 'directory') {
fs.mkdirSync(fpath, { recursive: true });
next();
} else {
fs.mkdirSync(path.dirname(fpath), { recursive: true });
const out = fs.createWriteStream(fpath);
stream.pipe(out);
stream.on('end', next);
}
});
extract.on('finish', resolve);
extract.on('error', reject);
fs.createReadStream(src).pipe(gunzip).pipe(extract);
});
}
// 使用示例
// extractZip('example.zip', './output');
// extractTarGz('example.tar.gz', './output').then(() => console.log('done'));9 个高频疑问