# up7-code-qt **Repository Path**: xproer/up7-code-qt ## Basic Information - **Project Name**: up7-code-qt - **Description**: No description available - **Primary Language**: Unknown - **License**: Unlicense - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-17 - **Last Updated**: 2026-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # qtup7 —— up7 大文件上传客户端(Qt 移植版) 本工程是 `F:/apps/up7/code/csharp`(WinForms + `HttpUploaderAppLib` COM 控件)的 **Qt Widgets 移植**, 源码与架构 1:1 对应,可直接用 Qt 5.12.4 (msvc2017) 编译运行。 ## 与原 C# 工程的对应关系 | C#(csharpApp) | Qt(qtup7) | 说明 | |-------------------------------|-------------------------------------|------| | `Form1.cs` / `Form1.Designer.cs` | `mainwindow.h/.cpp` | 主窗口,持有引擎与事件分发 | | `ui/FilesPanel.cs` | `filetransferpanel.h/.cpp` | 传输列表面板(工具栏 + 滚动列表) | | `ui/FileItem.cs` | `fileitemwidget.h/.cpp` | 单个文件/文件夹传输项 | | `ui/ProgressBarEx.cs` | `progressbarex.h/.cpp` | 可着色进度条 | | `ui/UpIconRes.cs` | `upiconres.h/.cpp` | 图标资源(改用 Qt 资源 `:/ico`) | | `ui/UpItemState.cs` / `UpToolIcon.cs` | `upitemstate.h` / `uptoolicon.h` | 状态/图标枚举 | | `IUploader.cs` | `iuploader.h/.cpp` | 上传任务统一接口 | | `FileUploader.cs` | `fileuploader.h/.cpp` | 单文件上传(init → 分块 → complete) | | `DirUploader.cs` | `diruploader.h/.cpp` | 文件夹上传(扫描 → 初始化 → 上传) | | `FileSvr.cs` | `filesvr.h/.cpp` | 文件/文件夹传输信息 | | `UpConfig.cs` / `UpApiConfig.cs` | `upconfig.h/.cpp` / `upapiconfig.h/.cpp` | 配置与接口地址 | | `UpErrCode.cs` / `UpState.cs` | `uperrcode.h/.cpp` / `upstate.h/.cpp` | 错误码 / 状态名 | | `HttpUploaderAppLib`(COM 控件) | `up7server.h/.cpp` | **见下方“引擎替换说明”**(WebSocket 桥接 `up7.exe`) | | `Newtonsoft.Json` | `QJsonDocument` / `QJsonObject` | JSON | | `WebClient.OpenRead`(同步 GET) | `QNetworkAccessManager`(异步 GET) | 服务端接口调用 | | `Properties/Resources` 内的 PNG | `resources.qrc` + `res/*.png` | 图标资源 | ## 引擎替换说明(重要) 原 C# 工程依赖一个 **Windows-only 的 COM 上传控件** `HttpUploaderAppLib.HttpPartitionClass` (GUID `{7F42343E-D6EA-4B8A-AB52-761188ADF0FF}`)来完成:文件/文件夹选择、扫描、MD5、分块上传与进度回传。 Qt 无法直接使用该 COM 控件,因此用 **`Up7Server`(WebSocket 客户端桥接)** 替代,二者共用同一套消息契约: - 下行:`Up7Server->postMessage(json)` 下发命令(`init` / `open_files` / `open_folders` / `add_file` / `scan_folder` / `post_file` / `post_folder`),JSON 的 `name` 与各字段与原 COM 控件完全一致; - 上行:`Up7Server->recvMessage(json)` 回传事件(`load_complete` / `open_files` / `open_folders` / `scan_process` / `scan_complete` / `md5_*` / `post_process` / `post_complete` / `post_error` …), 由 `MainWindow` 按 `name` 分发,逻辑与原 `Form1.recvMessage` 完全相同。 ### 通信方式:启动 `up7.exe` + WebSocket `Up7Server` 不再在进程内完成上传,而是: 1. **启动引擎**:`MainWindow` 构造时调用 `Up7Server::start()`,通过命令启动 `up7.exe`, 参数为 `up7://?port=9100`(端口与 `UpConfig::wsPort` 一致,默认 9100)。 `up7.exe` 由此在本机开启 WebSocket 服务。 2. **连接服务**:`Up7Server` 以 WebSocket 客户端连接 `ws://127.0.0.1:9100` (地址/端口由 `UpConfig::wsHost` / `wsPort` 配置)。 3. **双向转发**:`postMessage(json)` 原样 `sendTextMessage` 到服务端;服务端回传的 JSON 经 `onWsTextMessage` 通过 `recvMessage(json)` 向上层回传。消息契约(name 与字段)保持不变, `MainWindow` 与 `Uploader` 无需任何改动即可对接。 文件/文件夹选择、扫描、MD5、分块上传、进度计算等职责全部下沉到 `up7.exe` 服务端, 本工程只负责“启动引擎 + 维持 WebSocket 连接 + 双向转发 JSON 报文”,因此是一个**驱动 `up7.exe` 的轻量客户端外壳**。 ### 命令方法(对应 up7.app.js 的 Uploader7App) `Up7Server` 提供与前端 `up7.app.js`(参考 `F:\asp.net\up7\res\up7\up7.app.js`)**同名的命令方法**, 每个方法都把数据对象与 `{ name: "xxx" }` 合并后发送到 WebSocket,消息契约保持一致: | 方法 | 命令 name | 说明 | |------|-----------|------| | `init()` | `init` | 含完整 `config`(接口地址、分块大小、校验开关…),对应 JS 的 `{ config, name:"init" }` | | `exit()` | `exit` | 退出引擎 | | `openFiles()` | `open_files` | 选择文件 | | `openFolders()` | `open_folders`| 选择文件夹 | | `pasteFiles()` | `paste_files` | 粘贴(预留) | | `addFile(o)` | `add_file` | 添加本地文件 | | `addFolder(o)` | `add_folder` | 添加文件夹 | | `checkFile(o)` | `check_file` | 文件校验(秒传) | | `checkFolder(o)`| `check_folder`| 文件夹校验 | | `scanFolder(o)` | `scan_folder` | 扫描文件夹 + 计算 MD5 | | `postFile(o)` | `post_file` | 开始上传文件 | | `postFolder(o)` | `post_folder` | 开始上传文件夹 | | `updateFolder(o)`|`update_folder`| 更新文件夹信息 | | `delFolder(o)` | `del_folder` | 删除文件夹 | | `stopFile(o)` | `stop_file` | 停止文件上传 | | `delFile(id)` | `del_file` | 删除文件 | | `stopQueue()` | `stop_queue` | 停止队列 | `MainWindow` 与 `FileUploader` / `DirUploader` 现在只构造数据对象并调用上述方法, 命令的 name 与序列化统一由 `Up7Server::sendJson()` 完成。 > 连接未就绪时下发的首条命令(如 `init`)会被缓存,待 WebSocket 连通后自动补发, > 不会丢失。启动阶段若服务尚未就绪(连接被拒),会每 500ms 自动重试,最多 40 次(约 20s)。 ### 配置(`upconfig.h`) | 字段 | 默认 | 说明 | |------|------|------| | `wsHost` | `127.0.0.1` | `up7.exe` 开启的 WebSocket 服务地址 | | `wsPort` | `9100` | 与启动参数 `up7://?port=9100` 保持一致 | | `up7ExePath` | `""` | `up7.exe` 路径;为空则取客户端同目录或 PATH | 若与你的 `up7.exe` 实际监听地址/端口不一致,仅改这三个字段即可。 ## 构建 本机已验证可构建:Qt 5.12.4 `msvc2017`(**32 位** 套件)+ Visual Studio 2017。 - 方式一(脚本,已附带):`bash build_qt.sh`(脚本内已设置好 MSVC 环境变量,无需 `cmd /c`)。 - 方式二:Qt Creator 直接打开 `qtup7.pro`。 - 方式三:手动 ``` qmake qtup7.pro nmake # 或 jom / msbuild ``` 注意:本机 Qt 是 32 位 msvc2017 套件,必须用 **32 位**编译器(HostX86/x86), 否则会报 `LNK1112` 架构不匹配。 源码含中文注释(UTF-8 无 BOM),`.pro` 中已加 `QMAKE_CXXFLAGS += /utf-8`, 用 MSVC 构建不会出现 `C4819` / `C2447` 编码错误。 ## 运行 - 动态链接 Qt,运行期需同目录(或在 PATH 中)提供:`Qt5Core.dll`、`Qt5Gui.dll`、 `Qt5Widgets.dll`、`Qt5Network.dll`、`Qt5WebSockets.dll` 及其平台插件 `platforms/qwindows.dll`。 - 需将 `up7.exe` 置于客户端同目录(或通过 `UpConfig::up7ExePath` 指定),客户端启动时会自动拉起它 并以 WebSocket 连接;若未找到,`logMessage` 会输出启动失败提示(不影响界面显示)。 - 后端接口地址默认指向 `http://localhost:8889/api/up7/...`(见 `upapiconfig.h`), 按你的部署环境修改即可;`RangeSize`、`FileMd5` 等配置见 `upconfig.h`。 ## 已知差异 / 待确认 1. 原 C# 的 `add_fileLoc("D:\\ChromeSetup.exe")` 是写死的演示文件;本工程“上传本地文件”按钮改为弹出 单文件选择对话框,更符合实际使用。 2. COM 控件内部的秒传/块校验逻辑,本工程以可配置开关(`FileMd5`)保留,默认走最简 init→上传路径。 3. 分块上传的字段命名、文件夹子文件服务端路径等协议细节现由 `up7.exe` 服务端决定, 客户端不再实现分块 HTTP 上传逻辑(原 `UploadEngine` 内的 `uploadNextBlock` 等已移除), 因此与后端协议不一致时只改 `up7.exe` 一侧即可。