文件压缩
多文件 → ZIP · 浏览器本地 · 永不上传
zip/tar.gz/7z 打包
多文件 → ZIP · 浏览器本地 · 永不上传
压缩算法:DEFLATE(ZIP 标准),用 fflate 浏览器本地实现,不上传文件。
大小限制:建议总大小 < 500MB(受浏览器内存限制)。
兼容性:生成的 ZIP 可被所有解压工具识别(WinRAR / 7-Zip / 系统自带)。
了解工具定位 · 使用场景 · 对比优势
将文件或文件夹打包为 zip、tar.gz、7z 格式,支持自定义压缩级别与分卷大小。开发者分发代码包、运维备份日志、设计师交付素材集,无需安装客户端,直接在浏览器选择文件即可打包。文件上传至服务端处理,打包完成后自动清除,不保留任何副本。
设计师或开发者在交付项目时,需要将多个文件(PSD、代码文件、素材)整理成一个压缩包发给客户或团队成员。本工具支持 zip/tar.gz/7z 三种格式,一次性打包多个文件夹,保留目录结构,避免逐个发送的混乱和遗漏,确保接收方解压后直接可用。
运维人员每天产生大量日志文件,需要按周或按月打包归档,节省磁盘空间并便于传输。本工具支持 tar.gz 格式,能高效压缩大量小文件,压缩率优于 zip,且保留 Unix 权限和符号链接,适合服务器环境下的自动化脚本调用。
视频剪辑师或摄影师需要将几十个原始素材(视频、音频、工程文件)发给后期同事。直接传文件夹容易中断或超时,本工具将全部素材打包成一个 zip,体积减小 30%-50%,上传更快,且接收方无需安装额外软件即可解压。
在 Windows 和 macOS 之间传输文件时,NTFS 和 APFS 的兼容性问题常导致文件名乱码或属性丢失。本工具默认使用 zip 格式(跨平台兼容性最好),自动处理文件名编码,确保在任意系统解压后文件名和目录结构完整,避免重复传输。
用户需要将合同、简历等敏感文件发送给第三方,担心传输过程中被截获。本工具支持在打包时设置密码保护(7z 格式),加密后的压缩包即使被他人获取也无法解压查看内容,比单纯依赖传输通道加密多一层本地防护。
| 维度 | 本工具 | 竞品 A (7-Zip) | 传统方法 (命令行) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 需安装桌面软件,文件在本地处理 | 文件在本地处理,但需手动输入命令 |
| 操作门槛 | 打开网页,选择文件,点击打包 | 需下载安装,学习图形界面操作 | 需记忆 tar/gzip/7z 等命令及参数 |
| 处理速度 | 中等,受浏览器性能和文件大小影响 | 快,原生应用性能最优 | 快,脚本批量处理效率高 |
| 离线可用 | 需要网络加载页面,加载后可离线使用 | 完全离线,安装后无需网络 | 完全离线,依赖系统安装的软件包 |
| 平台兼容 | 跨平台,任何有浏览器的设备 | Windows 为主,Linux/macOS 需第三方或命令行 | Linux/macOS 原生支持,Windows 需安装 WSL 或 Git Bash |
| 批量处理 | 单次处理一个文件或文件夹 | 支持批量选择文件打包 | 可通过脚本实现高灵活度批量打包 |
| 压缩格式支持 | zip, tar.gz, 7z | 7z, zip, tar, gzip, bzip2 等 | 取决于安装的命令行工具,通常支持广泛 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| document.docx, image.png, script.py | archive.zip (1.2 MB → 980 KB) | 典型场景:混合文件类型打包 |
| large_video.mp4 (500 MB) | archive.tar.gz (500 MB → 498 MB) | 边界 case:已压缩格式几乎无收益 |
| empty_folder/ | archive.zip (0 KB) | 边界 case:空文件夹打包 |
| very_long_filename_1234567890_1234567890_1234567890.txt | archive.7z (1 KB) | 易错 case:超长文件名可能截断 |
| file_with_中文名.txt | archive.zip (1 KB) | 典型场景:非 ASCII 文件名兼容 |
| file_1.txt, file_2.txt, ... file_1000.txt | archive.tar.gz (10 KB → 2 KB) | 边界 case:大量小文件打包 |
| secret.key (二进制文件) | archive.7z (1 KB → 1 KB) | 易错 case:已加密文件无压缩空间 |
将一张 5MB 的 JPEG 照片直接拖入压缩包,期望体积大幅缩小先用图片工具(如 JPEGmini、TinyPNG)压缩图片本身,再将结果打包JPEG、PNG、MP4 等已经是压缩格式,再套一层 zip 几乎不会减少体积;压缩的是容器开销而非内容
把一个 1KB 的 .txt 文件压缩成 .zip,得到 2KB 的压缩包极小文件(< 几百字节)直接传输原文件,或合并成一个大文件后再压缩zip/7z 等格式需要存储文件名、目录结构、校验和等元数据,小文件下元数据开销超过压缩节省的空间
在 7-Zip GUI 中直接点“添加到压缩包”,未修改压缩级别(默认“存储”)手动将压缩级别改为“标准”或“最大”,或使用命令行 7z a -mx=9 archive.7z files7z 默认压缩级别是“存储”(不压缩),仅打包不压缩,体积与源文件几乎一致;需显式指定 -mx 参数
用 unzip archive.tar.gz 或双击 .tar.gz 文件直接解压先用 gunzip 解压得到 .tar,再用 tar -xf 解包;或一步到位 tar -xzf archive.tar.gz.tar.gz 是两层格式:gzip 压缩 + tar 打包。unzip 只处理 zip 格式,无法识别 gzip 流;解压工具必须支持级联操作
将整个 node_modules 或 .git 目录直接拖入压缩包压缩前删除 node_modules、.git、__pycache__、Thumbs.db 等目录,或使用排除参数(如 zip -r archive.zip . -x "node_modules/*" "*.log")node_modules 可能包含数十万个文件,打包后体积巨大且接收方通常不需要;排除后体积可减少 90% 以上
用 7z a -p123 archive.7z files,仅加密文件内容,文件名仍可见添加 -mhe=on 参数:7z a -p123 -mhe=on archive.7z files,或 GUI 中勾选“加密文件名”7z 默认只加密文件数据,文件名、目录结构、文件大小等元数据明文暴露;-mhe=on 才加密整个头信息
运行 tar -cf archive.tar.gz files,得到的是未压缩的 .tar 文件(后缀名误导)使用 tar -czf archive.tar.gz files(-z 表示 gzip 压缩),或先 tar -cf 再 gziptar 的 -c 仅打包,-z 才调用 gzip 压缩;后缀 .tar.gz 只是约定,不自动触发压缩行为
将 10 万个 1KB 的日志文件直接 zip -r log.zip logs/,等待数分钟先合并为一个大文件(cat logs/* > all.log),再压缩;或使用 tar 打包后再压缩zip 对每个文件单独压缩并存储文件头,大量小文件导致大量 I/O 和元数据开销;tar 先合并再压缩效率高得多
公式推导 · 流程图解 · 依据出处
压缩比 = 原始大小 / 压缩后大小
原始大小 — 压缩前文件总字节数压缩后大小 — 压缩后文件总字节数一个 10 MB 的文本文件,使用 zip 算法压缩后为 2.5 MB。压缩比 = 10 / 2.5 = 4.0,表示压缩后体积缩小为原来的 1/4。
适用于 zip / tar.gz / 7z 等通用打包压缩工具。压缩比受文件类型影响:文本、日志等冗余数据压缩比高(可达 5-10),已压缩格式(jpg / mp4)压缩比接近 1,几乎无压缩效果。
3 种主流语言 · 复制即用
import zipfile
import tarfile
import py7zr
import os
# 创建 ZIP 文件
with zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
zf.write('file1.txt')
zf.write('file2.txt')
# 创建 tar.gz 文件
with tarfile.open('example.tar.gz', 'w:gz') as tf:
tf.add('file1.txt')
tf.add('file2.txt')
# 创建 7z 文件
with py7zr.SevenZipFile('example.7z', 'w') as sz:
sz.writeall('file1.txt')
sz.writeall('file2.txt')
# 解压 ZIP
with zipfile.ZipFile('example.zip', 'r') as zf:
zf.extractall('output_zip')
# 解压 tar.gz
with tarfile.open('example.tar.gz', 'r:gz') as tf:
tf.extractall('output_tar')
# 解压 7z
with py7zr.SevenZipFile('example.7z', 'r') as sz:
sz.extractall('output_7z')package main
import (
"archive/tar"
"archive/zip"
"compress/gzip"
"io"
"os"
)
func main() {
// 创建 ZIP
zipFile, _ := os.Create("example.zip")
zw := zip.NewWriter(zipFile)
w, _ := zw.Create("file.txt")
w.Write([]byte("content"))
zw.Close()
zipFile.Close()
// 创建 tar.gz
tarFile, _ := os.Create("example.tar.gz")
gw := gzip.NewWriter(tarFile)
tw := tar.NewWriter(gw)
hdr := &tar.Header{Name: "file.txt", Size: int64(len("content"))}
tw.WriteHeader(hdr)
io.WriteString(tw, "content")
tw.Close()
gw.Close()
tarFile.Close()
// 解压 ZIP
zr, _ := zip.OpenReader("example.zip")
for _, f := range zr.File {
rc, _ := f.Open()
out, _ := os.Create(f.Name)
io.Copy(out, rc)
rc.Close()
out.Close()
}
zr.Close()
// 解压 tar.gz
gr, _ := gzip.NewReader(tarFile)
tr := tar.NewReader(gr)
for {
hdr, err := tr.Next()
if err != nil {
break
}
out, _ := os.Create(hdr.Name)
io.Copy(out, tr)
out.Close()
}
gr.Close()
}const fs = require('fs');
const zlib = require('zlib');
const tar = require('tar-stream');
const archiver = require('archiver');
const unzipper = require('unzipper');
// 创建 ZIP
const output = fs.createWriteStream('example.zip');
const archive = archiver('zip', { zlib: { level: 9 } });
archive.pipe(output);
archive.file('file1.txt', { name: 'file1.txt' });
archive.file('file2.txt', { name: 'file2.txt' });
archive.finalize();
// 创建 tar.gz
const pack = tar.pack();
const gzip = zlib.createGzip();
const ws = fs.createWriteStream('example.tar.gz');
pack.pipe(gzip).pipe(ws);
pack.entry({ name: 'file.txt' }, 'content');
pack.finalize();
// 解压 ZIP
fs.createReadStream('example.zip')
.pipe(unzipper.Extract({ path: 'output_zip' }));
// 解压 tar.gz
const gunzip = zlib.createGunzip();
const extract = tar.extract();
extract.on('entry', (header, stream, next) => {
stream.pipe(fs.createWriteStream(header.name));
stream.on('end', next);
});
fs.createReadStream('example.tar.gz').pipe(gunzip).pipe(extract);9 个高频疑问