简体中文 • English
QRSync — 纯浏览器实现、完全离线的孤岛文件传输工具。
通过二维码序列,在无网络、无 USB、无剪贴板、仅保留视觉界面的孤岛环境中传输任意文件。
在线体验 •
为什么选择 QRSync •
功能特点 •
快速开始 •
技术原理 •
本地使用
🌐 在线体验
👉 点击访问 QRSync
下载本仓库压缩包,页面加载完成后即可断开网络离线使用。
💡 为什么选择 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 校验码
}
核心技术栈
💻 本地使用
方法一:直接打开
- 下载本仓库代码并解压
- 双击
index.html 打开首页
- 分别打开发送端和接收端即可使用
方法二:本地服务器
git clone https://github.com/huiihao/QRSync.git
cd QRSync
# Python
python -m http.server 8080
# 或 Node.js
npx serve .
# 浏览器访问 http://localhost:8080
📦 项目结构
QRSync/
├── 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 许可证开源。
🙏 致谢
Made with ❤️ by QRSync Team
评论