QRSync — 纯浏览器实现、完全离线的孤岛文件传输工具。
通过二维码序列,在无网络、无 USB、无剪贴板、仅保留视觉界面的孤岛环境中传输任意文件。
在线体验 • 为什么选择 QRSync • 功能特点 • 快速开始 • 技术原理 • 本地使用
下载本仓库压缩包,页面加载完成后即可断开网络离线使用。
孤岛环境指没有网络连接、USB 设备被禁用、剪贴板被限制,仅保留屏幕和摄像头的极端场景。
| 场景 | QRSync 方案 |
|---|---|
| 🔌 内网隔离的服务器 | 手机扫描屏幕二维码即可传出文件 |
| 🏢 安全管控严格的办公环境 | 不依赖 USB、蓝牙、WiFi,纯视觉传输 |
| 📱 手机与电脑间的临时传文件 | 无需安装 App,打开浏览器即可互传 |
| 🚫 所有常规传输手段被禁用 | 二维码是最后可用的数据通道 |
核心优势:
- 零依赖 — 无需安装软件、无需服务器、无需网络
- 纯离线 — 所有数据处理在浏览器本地完成,不上传任何信息
- 跨平台 — 有浏览器就能用,Windows、macOS、Linux、Android、iOS 全覆盖
| 特性 | 说明 |
|---|---|
| 🌐 纯浏览器实现 | 无需安装任何软件,无需服务器支持,打开即用 |
| 📶 完全离线工作 | 在隔绝网络的环境下正常使用,数据不出本地 |
| 🔒 数据完整性校验 | CRC32 校验确保数据传输准确无误,分片级验证 |
| 📁 支持任意文件类型 | 文本、图片、文档、压缩包均可传输 |
| 🇨🇳 中文文件名完美支持 | 中文文件名无乱码,UTF-8 编码保证兼容性 |
| 💾 断点续传 | 接收进度自动保存至 IndexedDB,刷新页面不丢失 |
| 📱 移动端适配 | 针对手机摄像头扫描场景优化界面和交互 |
| 🎨 精美简约界面 | 现代简约风格设计,操作流程清晰直观 |
发送方: 打开 发送端 → 选择文件 → 点击「生成二维码」→ 按顺序展示二维码
接收方: 打开 接收端 → 允许摄像头权限 → 按顺序扫描二维码 → 下载文件
- 打开 发送端
- 点击或拖拽选择要传输的文件
- 调整分片大小和二维码尺寸(可选,默认值适用于大多数场景)
- 点击「生成二维码」按钮
- 按顺序展示二维码供接收端扫描
- 打开 接收端
- 点击「开始扫描」按钮,允许摄像头权限
- 按顺序扫描所有数据二维码
- 最后扫描文件名二维码(橙色边框标识)
- 点击「重组文件」按钮
- 点击「下载文件」保存到本地
原始文件 ──[deflate 压缩]──▶ 压缩数据 ──[分片]──▶ 数据分片 ──[二维码编码]──▶ 扫码传输
│
完整文件 ◀──[合并重组]── 接收数据 ◀──[二维码解码]── 扫码接收 ◀──────────────────────┘
数据分片:
{
"i": 0, // 分片索引
"t": 5, // 总分片数
"f": "ABC12", // 文件指纹
"h": "a3f9b", // CRC32 校验码
"d": "base64…" // 数据内容
}文件名分片:
{
"t": "fn", // 类型标识 (fn = 文件名)
"f": "XYZ89", // 文件指纹
"n": "base64…", // 编码后的文件名
"s": 1024, // 文件大小(字节)
"ts": 1234567890,// Unix 时间戳
"tc": 10, // 总分片数
"h": "abc12" // CRC32 校验码
}| 用途 | 库 | 说明 |
|---|---|---|
| 压缩算法 | pako | zlib/deflate 浏览器端实现 |
| 二维码生成 | qrcode.js | 纯 JS 二维码生成 |
| 二维码扫描 | ZXing | 多格式条码扫描 |
| 本地存储 | localForage | IndexedDB 异步存储 |
| 数据校验 | CRC32 | 分片完整性校验 |
- 下载本仓库代码并解压
- 双击
index.html打开首页 - 分别打开发送端和接收端即可使用
git clone https://github.com/huiihao/QRSync.git
cd QRSync
# Python
python -m http.server 8080
# 或 Node.js
npx serve .
# 浏览器访问 http://localhost:8080QRSync/
├── index.html # 入口页面
├── sender/index.html # 发送端
├── receiver/index.html # 接收端
├── js/
│ ├── qrcode.min.js # 二维码生成库
│ ├── pako.min.js # 压缩库
│ ├── jszip.min.js # ZIP 打包库
│ ├── FileSaver.min.js # 文件保存库
│ ├── zxing-library.min.js # 二维码扫描库
│ ├── jsQR.js # 二维码识别库
│ └── localforage.min.js # 本地存储库
├── README.md # 中文文档
├── README_EN.md # 英文文档
└── docs/PACKAGING.md # 打包说明
本项目为纯前端实现,无后端依赖,所有第三方库均本地化部署。
参考 docs/PACKAGING.md 了解如何将本项目打包为独立的可执行文件(Windows / Linux / macOS)。
| 参数 | 说明 |
|---|---|
| 范围 | 400 – 1200 字节 |
| 默认 | 600 字节 |
| 建议 | 较小分片提高扫描成功率,但会增加二维码数量 |
| 参数 | 说明 |
|---|---|
| 范围 | 256 – 800 像素 |
| 默认 | 400 像素 |
| 建议 | 根据屏幕尺寸和扫描距离调整 |
- 扫描顺序 — 请按顺序扫描所有数据分片,最后扫描文件名二维码(橙色边框)
- 分片大小 — 建议保持默认 600 字节,过大分片可能导致二维码无法识别
- 文件大小 — 建议不超过 10MB,过大文件会生成大量二维码
- 屏幕亮度 — 确保发送端屏幕亮度足够,以提高扫描成功率
- 摄像头对焦 — 保持手机与屏幕适当距离,确保二维码清晰
- 校验失败 — 如遇到校验失败,重新扫描该二维码即可
- 所有数据仅在浏览器本地处理,不会上传到任何服务器
- 接收进度使用浏览器 IndexedDB 存储,不涉及隐私泄露
- CRC32 校验确保数据完整性,文件指纹机制防止不同文件混淆
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交修改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
本项目基于 MIT 许可证开源。
- 参考项目 QRBridge by @wallechfox
- pako — 快速 zlib 压缩库
- qrcode.js — 二维码生成库
- ZXing — 二维码扫描库
- localForage — 本地存储库
Made with ❤️ by QRSync Team




