文件压缩

zip/tar.gz/7z 打包

410 次访问
FILE COMPRESS · ZIP

文件压缩

多文件 → 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 格式),加密后的压缩包即使被他人获取也无法解压查看内容,比单纯依赖传输通道加密多一层本地防护。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (7-Zip)传统方法 (命令行)
数据隐私纯浏览器处理,文件不上传服务器需安装桌面软件,文件在本地处理文件在本地处理,但需手动输入命令
操作门槛打开网页,选择文件,点击打包需下载安装,学习图形界面操作需记忆 tar/gzip/7z 等命令及参数
处理速度中等,受浏览器性能和文件大小影响快,原生应用性能最优快,脚本批量处理效率高
离线可用需要网络加载页面,加载后可离线使用完全离线,安装后无需网络完全离线,依赖系统安装的软件包
平台兼容跨平台,任何有浏览器的设备Windows 为主,Linux/macOS 需第三方或命令行Linux/macOS 原生支持,Windows 需安装 WSL 或 Git Bash
批量处理单次处理一个文件或文件夹支持批量选择文件打包可通过脚本实现高灵活度批量打包
压缩格式支持zip, tar.gz, 7z7z, zip, tar, gzip, bzip2 等取决于安装的命令行工具,通常支持广泛

使用指南

上手步骤 · 输入输出 · 避坑提示

使用步骤

  1. 选择输出格式:ZIP、tar.gz 或 7z,默认 ZIP
  2. 上传文件或拖入文件夹,单文件 ≤ 500MB,支持多文件/多文件夹
  3. 点击「开始压缩」按钮,后端 Go 服务自动打包
  4. 打包完成后点击「下载」保存压缩包,或「复制链接」分享

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
document.docx, image.png, script.pyarchive.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.txtarchive.7z (1 KB)易错 case:超长文件名可能截断
file_with_中文名.txtarchive.zip (1 KB)典型场景:非 ASCII 文件名兼容
file_1.txt, file_2.txt, ... file_1000.txtarchive.tar.gz (10 KB → 2 KB)边界 case:大量小文件打包
secret.key (二进制文件)archive.7z (1 KB → 1 KB)易错 case:已加密文件无压缩空间

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 用 .zip 压缩 .jpg 文件

错误
将一张 5MB 的 JPEG 照片直接拖入压缩包,期望体积大幅缩小
修复
先用图片工具(如 JPEGmini、TinyPNG)压缩图片本身,再将结果打包

JPEG、PNG、MP4 等已经是压缩格式,再套一层 zip 几乎不会减少体积;压缩的是容器开销而非内容

2. 压缩后文件反而变大

错误
把一个 1KB 的 .txt 文件压缩成 .zip,得到 2KB 的压缩包
修复
极小文件(< 几百字节)直接传输原文件,或合并成一个大文件后再压缩

zip/7z 等格式需要存储文件名、目录结构、校验和等元数据,小文件下元数据开销超过压缩节省的空间

3. 用 7z 打包但选了“存储”模式

错误
在 7-Zip GUI 中直接点“添加到压缩包”,未修改压缩级别(默认“存储”)
修复
手动将压缩级别改为“标准”或“最大”,或使用命令行 7z a -mx=9 archive.7z files

7z 默认压缩级别是“存储”(不压缩),仅打包不压缩,体积与源文件几乎一致;需显式指定 -mx 参数

4. 把 .tar.gz 当作单一格式直接解压

错误
用 unzip archive.tar.gz 或双击 .tar.gz 文件直接解压
修复
先用 gunzip 解压得到 .tar,再用 tar -xf 解包;或一步到位 tar -xzf archive.tar.gz

.tar.gz 是两层格式:gzip 压缩 + tar 打包。unzip 只处理 zip 格式,无法识别 gzip 流;解压工具必须支持级联操作

5. 压缩时未排除缓存/临时文件

错误
将整个 node_modules 或 .git 目录直接拖入压缩包
修复
压缩前删除 node_modules、.git、__pycache__、Thumbs.db 等目录,或使用排除参数(如 zip -r archive.zip . -x "node_modules/*" "*.log")

node_modules 可能包含数十万个文件,打包后体积巨大且接收方通常不需要;排除后体积可减少 90% 以上

6. 用 .7z 加密但未加密文件名

错误
用 7z a -p123 archive.7z files,仅加密文件内容,文件名仍可见
修复
添加 -mhe=on 参数:7z a -p123 -mhe=on archive.7z files,或 GUI 中勾选“加密文件名”

7z 默认只加密文件数据,文件名、目录结构、文件大小等元数据明文暴露;-mhe=on 才加密整个头信息

7. 压缩 .tar.gz 时未指定 -z 参数

错误
运行 tar -cf archive.tar.gz files,得到的是未压缩的 .tar 文件(后缀名误导)
修复
使用 tar -czf archive.tar.gz files(-z 表示 gzip 压缩),或先 tar -cf 再 gzip

tar 的 -c 仅打包,-z 才调用 gzip 压缩;后缀 .tar.gz 只是约定,不自动触发压缩行为

8. 用 zip 压缩大量小文件时速度极慢

错误
将 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,几乎无压缩效果。

原理图

选择文件单/多文件选择格式zip / tar.gz / 7z服务端打包Go 后端处理下载.zip后端处理流程接收文件流压缩算法处理生成压缩包返回下载
用户输入 服务端处理 输出结果

开发者集成

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 个高频疑问

这个在线压缩工具支持压缩哪些文件格式?
本工具支持将单个或多个文件打包为 zip、tar.gz、7z 三种主流压缩格式。输入文件可以是任意类型(文档、图片、视频、程序等),没有格式限制。输出时,zip 兼容性最广(Windows/macOS/Linux 都原生支持),tar.gz 常用于 Linux 服务器环境,7z 压缩率最高但需要额外软件(如 7-Zip、PeaZip)解压。选择哪种格式取决于接收方能否方便解压。
上传文件后为什么等了好久还没压缩完?是不是卡了?
压缩时间取决于文件总大小和服务器负载。本工具采用后端 Go 处理,文件上传到服务器后再执行压缩,因此受你的上传带宽、服务器当前并发数、文件类型共同影响。大文件(超过 500MB)或大量小文件(成千上万个)耗时较长,属于正常现象。如果上传进度条不动,可能是网络断开或文件过大超时——建议先压缩成多个小包再上传,或检查文件是否超过服务器限制(通常单文件上限 2GB)。
压缩后的文件大小和本地用 WinRAR 压出来不一样,哪个更准确?
两种工具用的压缩算法和参数可能不同,所以压缩率有差异是正常的。本工具使用 Go 标准库的 compress/flate(zip)、compress/gzip(tar.gz)和第三方 7z 实现,默认采用中等压缩级别(速度与体积折中)。WinRAR 默认使用 RAR 格式(非本工具支持的三种格式),且允许自定义字典大小、固实压缩等高级参数,通常压缩率更高但速度更慢。如果想对比,可以手动选择压缩级别(本工具未暴露该选项时,默认是平衡模式)。
压缩包里的文件名是乱码怎么办?
乱码多出现在跨平台场景:Windows 用 GBK 编码文件名,本工具服务端(Linux)默认用 UTF-8 处理,打包时未强制转换编码。解压时如果系统自动识别编码失败,就会显示乱码。解决办法:① 压缩前将文件名改为纯英文或数字;② 解压时手动选择 UTF-8 编码(如 7-Zip 在「选项→编码」中设置);③ 如果已生成乱码包,可用 Locale Emulator(Windows)或 unar(macOS/Linux)指定编码解压。
文件上传到服务器压缩,会不会泄露我的隐私?
文件会上传到后端服务器进行压缩处理,处理完成后服务器会立即删除原始文件和压缩包,不保留任何副本。传输过程使用 HTTPS 加密,中间人无法直接读取文件内容。但请注意:本工具不适合处理包含敏感信息(如身份证扫描件、合同、密码文件)的数据——建议先对敏感文件进行本地加密(如用 VeraCrypt 创建加密容器),再上传压缩。如果对隐私要求极高,应使用本地压缩软件(如 7-Zip)而非在线工具。
为什么我选了 7z 格式,但压缩后的文件比 zip 还大?
7z 格式通常在压缩率上优于 zip,但有两种情况可能反超:① 文件本身已经是高度压缩的格式(如 .jpg、.mp4、.zip 本身),再次压缩空间极小,7z 的额外开销反而使体积变大;② 文件数量极少(如只压 1 个 1KB 的文本),7z 的容器头信息占比大。7z 的优势体现在大量小文件或未压缩的文本/程序上。如果发现 7z 更大,换回 zip 或 tar.gz 即可。
压缩过程中断网了,文件能恢复吗?
不能。本工具采用一次性上传→处理→下载的流程,不提供断点续传或临时缓存。如果在上传阶段断网,文件未完整到达服务器,不会生成无效压缩包;如果在压缩处理阶段断网,服务器已完成压缩但无法将结果返回给你,文件会被服务器自动清理。建议在稳定网络下操作大文件,或先分卷压缩成多个小包再逐个上传。如果经常断网,推荐使用本地软件(如 7-Zip、Bandizip)。
压缩后下载下来的文件打不开,提示格式损坏,怎么办?
先确认下载是否完整:对比浏览器显示的下载大小和服务器返回的 Content-Length 是否一致,不一致说明下载中断了,重新下载。如果大小一致仍打不开,可能是上传过程中文件被截断(超过服务器限制)。尝试用 7-Zip 的「修复」功能打开损坏的 zip/7z 文件(文件→修复),tar.gz 损坏则较难恢复。避免方法:单次压缩文件总大小不要超过 1GB,且压缩前检查原始文件本身能正常打开。
这个工具和 7-Zip / WinRAR 比,优势在哪?
优势是免安装、跨平台、随时随地用。无需下载软件,浏览器打开即可操作,适合临时需要压缩文件(如帮别人打包发邮件)或在受限环境(如公司电脑无安装权限)使用。劣势也很明显:受上传带宽限制大文件慢、不支持分卷压缩/加密/固实压缩等高级功能、文件需经服务器中转有隐私风险。如果频繁压缩或处理敏感数据,本地软件是更好的选择。
选择 打开 +新窗口 esc关闭