一个基于Go+Gin实现的简单易用的跨设备文件传输工具,让您可以在手机和电脑之间轻松分享文件和文本内容。
本工具在您的电脑上启动一个本地服务器,并获取电脑在局域网中的IP地址。通过生成包含此IP地址的二维码,您的手机可以扫描并直接访问电脑上的文件传输界面。请注意:手机和电脑必须连接在同一个局域网(WiFi)下才能正常使用。
项目采用了简洁高效的技术栈:
- 前端界面: 使用Lorca库创建窗口,通过React实现用户界面
- 后端服务: 使用Gin框架提供RESTful API接口
- 实时通信: 使用Gorilla WebSocket实现设备间的实时通知
- 二维码生成: 使用go-qrcode库生成二维码图片
项目采用前后端分离的架构:
- 桌面应用: 通过Lorca创建一个轻量级窗口,加载本地HTML页面
- Web服务: Gin框架提供文件上传、下载、二维码生成等API接口
- 实时通信: WebSocket连接实现手机与电脑之间的实时消息推送
- 文本文件
- 图片文件(.jpg, .png, .gif等)
- 其他常见文件格式
- 扫描二维码连接到电脑
- 点击"上传文件"按钮
- 选择您要发送的文件
- 点击确认上传
- 文件将保存在电脑的指定文件夹中
- 在电脑程序界面上选择要分享的文件
- 生成包含文件信息的二维码
- 用手机扫描该二维码
- 在手机上即可查看或下载文件
- 扫描二维码连接到电脑
- 在文本框中输入您要发送的内容
- 点击发送按钮
- 文本内容将自动保存为文件在电脑上
go-file-sync/
├── controller/ # 控制器包
│ ├── address_controller.go # IP地址获取控制器
│ ├── file_controller.go # 文件下载控制器
│ ├── files_controller.go # 文件上传控制器
│ ├── qrcode_controller.go # 二维码生成控制器
│ └── text_controller.go # 文本上传控制器
├── frontend/ # 前端资源
│ └── dist/
├── main.go # 主程序入口
├── go.mod # Go模块定义
└── go.sum # 依赖版本锁定
-
接口地址:
POST /api/v1/texts
-
功能描述: 接收前端传递的文本内容并保存为文件
-
请求参数:
{ "raw": "要上传的文本内容" }
-
返回结果:
{ "filename": "生成的文件名.txt" }
-
状态: ✅ 已完成
-
接口地址:
GET /api/v1/addresses
-
功能描述: 获取本机非回环IPv4地址列表
-
请求参数: 无
-
返回结果:
{ "addresses": ["192.168.1.100", "10.0.0.2"] }
-
状态: ✅ 已完成
- 接口地址:
GET /uploads/:path
- 功能描述: 下载指定路径的文件
- 请求参数:
path
(路径参数): 文件相对路径
- 返回结果: 文件内容
- 状态: ✅ 已完成
- 接口地址:
GET /api/v1/qrcodes
- 功能描述: 根据内容生成二维码图片
- 请求参数:
content
(查询参数): 要编码为二维码的内容
- 返回结果: PNG格式的二维码图片
- 状态: ✅ 已完成
-
接口地址:
POST /api/v1/files
-
功能描述: 上传文件到服务器
-
请求参数:
raw
(表单数据): 要上传的文件
-
返回结果:
{ "url": "/uploads/生成的文件名" }
-
状态: ✅ 已完成
- 接口地址:
WS /ws
- 功能描述: 实现实时通信功能,用于文件同步通知
- 状态: ✅ 已完成
- 电脑已安装Go语言环境(版本1.20或更高)
- 电脑和手机必须连接在同一个局域网(WiFi)下
- 可以是同一个WiFi网络
- 或者电脑通过网线连接、手机连接WiFi但两者在同一个路由器下
- 或者一方连接另一方开启的个人热点
-
打开电脑终端,进入项目文件夹
-
运行以下命令安装所需组件:
go mod tidy
-
在电脑终端中运行以下命令启动程序:
go run main.go
-
程序会自动在基于lorca打开一个webView,并显示电脑的局域网IP地址
-
确保手机已连接到同一个局域网
-
用手机扫描电脑界面上的二维码,即可开始使用
通过这个项目的开发,我深入学习了Go语言的多个重要概念:
- 并发编程: 理解了Go的并发模型,特别是发布订阅模式的实现
- 通道操作: 掌握了通道的正确使用方法,避免了常见的通道操作错误
- 模块管理: 学会了Go应用中引入本地包的正确方法
- Web开发: 实践了使用Gin框架构建RESTful API的过程
- 网络编程: 通过WebSocket实现了实时通信功能