DShare 是一款基于 DTK(Deepin Tool Kit) 专为 deepin 桌面环境
打造的文件共享软件。它把本机的一个目录(~/myshare)通过局域网共享出去:
既提供原生 DTK 图形界面在本地管理文件,也内置一个 HTTP/HTTPS 服务,让同局域网
内的其他设备通过浏览器或本程序直接浏览、下载、上传文件。
采用 DTK6 开发,深度集成 deepin 的视觉风格与桌面组件(窗口、控件、主题、 提示框、日志等),是 deepin / UOS v25 桌面下体验一致的文件共享工具。
English version is available at the bottom of this file.
- 本地文件管理:基于 DTK 的图形界面,浏览共享目录
~/myshare,支持 新建文件夹、复制/粘贴、拖拽移动/复制、删除、双击打开。 - Web 文件共享:程序启动时自动在 5000 端口 开启服务,可访问地址显示在
窗口底部状态栏(随「访问需授权」开关在
http:///https://间切换):- 浏览目录(带路径导航、文件大小展示)
- 下载单个文件
- 通过网页表单上传文件、新建文件夹
- 未开启授权时使用明文 HTTP,浏览器直接访问、无自签证书告警;
- 开启授权时使用 HTTPS(自动用
openssl生成自签名证书并写入本机 LAN IP 到 SAN),以加密保护授权凭据,浏览器会提示证书不受信任,选择「继续访问」即可。
- 局域网设备发现:基于多播(UDP 端口 5001 / 组播组
239.255.42.99)自动 发现同局域网内其它运行本程序的 deepin 机器。可按机器名正则发起查找,避免 手动记 IP。 - 远程目录浏览与传输:在地址栏「机器」下拉中选择另一台设备即可只读浏览其
共享目录:
- 双击文件 → 下载到本机缓存并默认打开
- 把远程文件拖到本地视图/系统文件管理器 → 下载
- 把本地文件拖入远程视图 → 上传到对方共享目录
- 访问授权(默认开启):任何设备访问你的共享都需经你手动批准。授权请求
会弹出提示框显示对方机器名与 IP;浏览器端通过自动握手 + Cookie 完成授权,桌面
客户端通过
AuthManager自动完成握手,无需用户记忆任何口令。写入侧另有独立防线: 分片/文件大小上限、offset 连续性校验、同名文件拒绝覆盖(服务端返回 409,桌面 客户端会询问是否覆盖后再重传)。不需要授权时可在顶部关闭开关,此时回到明文 HTTP。 - HTTPS 引导页:授权模式下本机同时监听明文 5080 端口,但该端口不提供任何 共享内容,只返回一张提示页说明「本共享需通过 HTTPS 访问」并给出「继续访问」 按钮。扫码或直接拿到地址的人会先看到说明,再点进 HTTPS 地址,不会被证书告警劝退。
- 手机扫码访问:地址栏「机器」下拉框右侧有一个二维码,实时对应本机当前 共享目录的网页地址。授权模式下二维码指向 5080 引导页(无证书告警),选择 「继续访问」后进入 HTTPS 授权流程;未开启授权时直接指向该目录的 HTTP 地址。 点击二维码弹出大图预览(含地址与「复制地址」按钮)。进入远程浏览时该二维码 自动禁用。「添加客户端」入口已并入下拉框的末项「+ 添加客户端…」,选中即可查找 并连接其它设备。
| 依赖 | 说明 |
|---|---|
| CMake >= 3.13 | 构建系统 |
Qt6 Core / Widgets / Network / HttpServer |
应用框架与 HTTP 服务 |
DTK6 Core / Gui / Widget / Log |
deepin 桌面组件与日志(本程序基于此构建) |
openssl |
仅在没有配置 HTTPS 证书、临时生成自签名证书时用到其命令行(配了正式证书就不需要) |
| C++17 编译器(g++ / clang) | — |
适用于 deepin / UOS v25(DTK6)环境。
# 在项目根目录
mkdir -p build && cd build
cmake ..
make -j"$(nproc)"
# 运行(未安装时可直接执行构建产物)
./dshare
# 可选:安装到系统
sudo make install # 可执行文件 -> /usr/bin,桌面项 -> /usr/share/applications安装后也可从应用菜单启动(桌面项名称为「DShare」)。
每个版本的 Release 都会附带以下文件(scripts/build-release.sh 一键构建,产物落在
dist/,见「构建 Release 产物」):
| 文件 | 用途 |
|---|---|
dshare_<版本>_<架构>.deb |
Debian/deepin 本地安装包(amd64 / arm64 / loong64) |
<appid>_<版本>_<架构>_binary.layer |
如意玲珑(linyaps)层文件,用于玲珑环境与商店投稿 |
SHA256SUMS |
上述产物的 SHA-256 校验和 |
下载后先校验,再安装:
cd 下载目录
sha256sum -c SHA256SUMS # 全部文件应输出“成功 / OK”安装 deb:
sudo apt install ./dshare_1.0.1_amd64.deb
# 卸载
sudo apt remove dshare安装玲珑 layer(ll-cli 不需要 sudo,装到当前用户目录下):
ll-cli install ./io.github.zhutianhao.dshare_1.0.1.0_x86_64_binary.layer
# 运行 / 查看 / 卸载
ll-cli run io.github.zhutianhao.dshare
ll-cli list | grep dshare
ll-cli uninstall io.github.zhutianhao.dshare装完即可在应用菜单里看到 DShare。首次安装时玲珑会自动补拉该应用的 base 与
runtime(org.deepin.base、org.deepin.runtime.dtk),需要联网。
架构对应关系:
amd64 ↔ x86_64、arm64 ↔ arm64、loong64 ↔ loong64。 deb 包名用左侧命名,玲珑层文件名用右侧命名;layer 必须与机器架构一致。 另外ll-builder export -o dshare.uab可导出单文件离线包, 同样用ll-cli install ./dshare.uab安装(当前 CI 只产出 layer)。
# 需要 dpkg-dev(dpkg-buildpackage)与 linglong-builder(ll-builder)
sudo apt install -y dpkg-dev debhelper linglong-builder
scripts/build-release.sh # 产出 deb + layer + SHA256SUMS 到 dist/
scripts/build-release.sh --deb-only # 只要 deb
scripts/build-release.sh --layer-only # 只要玲珑 layer
scripts/build-release.sh --sums-only # 不重新构建,只重算 SHA256SUMSll-builder 与 dpkg-buildpackage 都按本机架构构建,不做交叉编译,因此需要出
arm64 / loong64 产物时请在对应架构的机器上跑一遍脚本,把各架构产物汇总到同一个目录
后执行一次 --sums-only 生成统一的 SHA256SUMS 再发布。脚本最后会打印可直接执行的
gh release create 命令。
打包细节:deb 的依赖不写死版本下限(debian/rules 会去掉 dh_shlibdeps
按构建机库版本生成的下限),否则在容器等较新环境里构建的 deb 会因为
libqt6widgets6、libdtk6widget 版本过高而在 deepin 25 上装不上。
仓库配了两个工作流:
| 工作流 | 触发 | 做什么 |
|---|---|---|
.github/workflows/ci.yml |
推送到 main / PR | 在玲珑容器里完整编译一次,作为编译检查 |
.github/workflows/release.yml |
推送 v* tag(也可手动触发) |
构建 amd64 + arm64 的 deb 与玲珑 layer,生成 SHA256SUMS 并创建 GitHub Release |
之所以要借玲珑的容器:GitHub 官方 runner 是 Ubuntu,装不了 DTK6 开发包。而玲珑官方
软件源提供 xUbuntu_24.04(含 amd64/arm64)的 linglong-builder,ll-builder 会在
deepin base + dtk runtime 容器里编译——宿主不需要任何 deepin 依赖。deb 也是在同一套
容器里跑 dpkg-buildpackage 产出的。
发版流程:
git tag v1.0.1 && git push origin v1.0.1 # 即触发构建与 Release一次构建的大部分时间花在拉取玲珑的 base / dtk runtime 层上(首次约 10 分钟,
编译本身只要 20 秒左右),因此工作流会缓存 ~/.cache/linglong-builder
(ll-builder 以普通用户运行时存放层数据的目录,按架构各一份,缓存键带
linglong.yaml 的哈希,升级 base/runtime 会自动失效)。命中缓存后单个架构
约 3–5 分钟。
loong64 目前没有官方 runner,需要一台标签为 [self-hosted, linux, loong64] 的
deepin/loong64 机器;手动触发工作流时勾选 include_loong64 才会构建该架构。
(linglong.yaml 中的多架构库目录 lib/<triplet> 已按构建机自动推导,无需手改。)
启动后默认进入本机 ~/myshare(不存在会自动创建)。通过工具栏即可:
返回上级/新建文件夹/刷新/复制/粘贴- 右键菜单:新建文件夹、刷新、复制、粘贴、删除、打开
- 选中文件后在本窗口内拖拽 = 移动,从外部(如系统文件管理器)拖入 = 复制
- 本机访问:浏览器打开状态栏显示的地址(如 https://localhost:5000)。
- 局域网访问:窗口底部状态栏会显示当前可访问地址——未开启授权 为
http://<你的IP>:5000;开启授权(默认)为https://<你的IP>:5000, 并额外给出更易转发的明文引导页http://<你的IP>:5080。 - 把引导页地址发给同局域网的其他人最省事:对方打开后看到一张说明页,点 「继续访问」即跳到 HTTPS 地址。
- 授权模式下浏览器会提示自签名证书不受信任,选择「继续访问」即可(证书仅用于 加密授权凭据,不提供第三方信任链);未开启授权 时为明文 HTTP,无安全提示。
- 在网页中可浏览目录、点击文件下载、使用表单上传文件或新建文件夹。
- 网页上传会实时显示进度与速度,上传期间禁用上传按钮,避免重复提交。
- 上传遇到同名文件时服务端不会覆盖,网页会提示「目标已存在,未覆盖」。
- 点击工具栏
添加,弹出「查找」对话框。 - 输入目标机器名(作为正则表达式,留空/
.*匹配全部),点击「查找」。 - 程序持续发送多播查询,下方列表会显示应答的机器(已去重)。
- 双击列表中的机器,即把它加入地址栏「机器」下拉框并切换过去。也可直接在下 拉框末项「+ 添加客户端…」触发查找对话框。
在「机器」下拉框选择某台远程设备后:
- 下载:双击文件(下载并打开)/ 把文件拖到本地视图或桌面。
- 上传:把本地文件拖入远程视图的目录中(可一次拖入多个)。上传时会弹出进度 窗口,显示当前文件、整体进度、实时速度,并可随时取消。
- 远程目录为只读,不支持在其中新建/删除/粘贴。
- 收发两端都是分片流式处理(4 MB/片,边收边写),因此单个文件可以超过 2 GB, 也不会把整个文件读进内存。
授权模式默认使用 HTTPS。证书来源按以下顺序决定:
- 用户导入的证书(工具栏「证书」按钮):选定证书与私钥后,程序会校验
PEM 格式、有效期,并做一次本机回环 TLS 握手确认二者匹配;通过后配置写入
~/.config/dshare/cert.conf(只记录文件路径,不复制私钥内容,所以用 Let's Encrypt 这类会定期续期的证书时无需重复导入)。 - 自签名证书:未导入证书时,用
openssl命令在~/.cache/dshare/下生成 有效期 10 年的自签名证书(私钥权限 0600)。浏览器会提示证书不受信任,属预期行为。
要点:
- 导入正式证书后不再调用 openssl,也就不存在「环境缺 openssl 导致无法共享」的问题; 此时浏览器与手机扫码都不会有证书告警(5080 引导页仍保留,作为兜底)。
- 只支持不带密码的 PEM 私钥。常驻服务无法在启动时等人输密码,遇到加密私钥会提示
先用
openssl rsa -in <私钥> -out <新私钥>去密码。 - 证书过期或尚未生效时不会以它启动 HTTPS,也不会悄悄退回自签名或明文,而是弹出 选择框(见下)。距到期 30 天内会在状态栏提示剩余天数。
- 更换/清除证书需要重启共享服务(SSL 配置在监听时就固定了),程序会自动重启。
环境无法启用 HTTPS 时(既没有可用证书、系统也没有 openssl,或 Qt 未启用 SSL), 启动后会弹框让你显式选择,绝不静默降级:
| 选项 | 行为 |
|---|---|
| 导入证书 | 打开证书选择框,成功后立即启动加密共享 |
| 明文共享 | 二次确认后改用 HTTP(任何人可访问),状态栏常驻红色警告 |
| 保持停止 | 本次不共享;状态栏显示未启动原因,可稍后导入证书或手动关闭授权开关 |
顶部「访问需授权」开关默认处于开启状态:
- 任何未授权设备访问你的共享,你都会收到弹窗,显示请求方的 机器名与 IP,可选择「允许」或「拒绝」。
- 超时(5 分钟)未处理视为拒绝;同时等待批准的请求上限为 64 条,超出会被限流, 避免恶意刷请求。
- 对浏览器与桌面客户端均生效,授权过程对终端用户透明。
- 开启授权时共享服务使用 HTTPS(加密) 以保护授权凭据,并在 5080 端口 提供明文引导页引导访客切换过来;关闭时则用明文 HTTP,5080 端口随之关闭。 协议随开关自动切换并重启服务。
- 注意:授权记录只保存在内存中,重启程序后需要重新批准各设备。
地址栏「机器」下拉框右侧显示本机当前共享目录对应的网页二维码:
- 手机(需与本机在同一局域网)扫码,打开后浏览 / 下载文件。
- 二维码地址随当前目录与「访问需授权」开关实时刷新:开启授权时指向明文引导页
http://<本机IP>:5080/?rel=...(先看到说明页,点「继续访问」进 HTTPS,全程无 证书弹窗打断),未开启授权时直接为http://<本机IP>:5000/browse/...。 - 点击二维码 弹出大图预览,可长按/扫码,或用「复制地址」按钮把访问地址 复制到剪贴板,方便发给他人。
- 进入远程浏览(选中其它设备)时,该二维码自动禁用,因为此时展示的是 对方的目录、而非本机共享。
| 用途 | 协议 | 端口 | 说明 |
|---|---|---|---|
| Web 文件服务 | HTTP(未授权)/ HTTPS(需授权,默认) | 5000 | 协议随「访问需授权」开关自动切换 |
| HTTPS 引导页 | HTTP | 5080 | 仅授权模式开启;只返回提示页,不含共享内容 |
| 局域网发现 | UDP 多播 | 5001 | 组播组 239.255.42.99 |
配置文件:~/.config/dshare/cert.conf(HTTPS 证书路径,详见「HTTPS 证书」一节)。
上传侧限制(服务端强制):单片 ≤ 8 MiB,单文件 ≤ 8 GiB;续传分片的 offset
不得越过已有内容末尾(防止稀疏文件撑爆磁盘);同名文件必须显式 overwrite=1
才可覆盖。
dshare/
├── main.cpp # 程序入口,初始化 DApplication(DTK)
├── mainwindow.{h,cpp} # 主窗口:本地浏览、拖拽、跨机传输、授权弹窗
├── fileserver.{h,cpp} # 内嵌 HTTP/HTTPS 服务(浏览/下载/上传/授权)
├── discovery.{h,cpp} # 局域网多播设备发现
├── remotemodel.{h,cpp} # 远程共享目录只读模型(拖拽支持)
├── finddialog.{h,cpp} # 「查找设备」对话框
├── authmanager.{h,cpp} # 客户端侧授权握手管理
├── fileuploader.{h,cpp} # 分片上传器与上传进度窗口
├── updirproxy.h # 本地目录的「返回上一级」代理模型
├── certdialog.{h,cpp} # HTTPS 证书导入对话框
├── dshare.desktop # 桌面启动项
├── debian/ # deb 打包配置
├── linglong.yaml # 如意玲珑(linyaps)构建描述
├── scripts/build-release.sh # 一键产出 deb / layer / SHA256SUMS
├── translations/ # 中文本地化(zh_CN)
└── CMakeLists.txt # 构建配置
本程序以 GNU General Public License v3 (GPL-3.0) 发布,详见仓库根目录的
LICENSE 文件。
DShare is a file-sharing application built with DTK (Deepin Tool Kit)
specifically for the deepin desktop environment. It shares a local
directory (~/myshare) over the LAN: a native DTK GUI for local file
management plus a built-in HTTP/HTTPS server so other devices can browse,
download, and upload files via a browser or another instance of this app.
Highlights
- Native DTK6 GUI, consistent with the deepin / UOS v25 desktop look and feel.
- Local management of
~/myshare(create folder, copy/paste, drag-drop, delete). - Built-in web server on port 5000. Access authorization is on by default: every device must be approved by the host, and the service then runs over HTTPS (self-signed cert). A plain-HTTP landing page on port 5080 explains this and offers a "Continue" button, so visitors are not stopped by a cert warning out of nowhere. Turning authorization off switches everything back to plain HTTP. Browse, download, upload, and create folders from any browser.
- LAN peer discovery via multicast (UDP 5001, group
239.255.42.99), with machine-name regex matching. - Read-only remote browsing of other peers, with drag-to-download / drag-to-upload file transfer.
- Upload hardening enforced server-side: ≤ 8 MiB per chunk, ≤ 8 GiB per file,
chunk
offsetmay not go past the existing end of file (no sparse-file disk exhaustion), and existing files are never overwritten silently — the uploader gets HTTP 409 and asks the user before retrying withoverwrite=1. - HTTPS certificates: import your own certificate and private key (PEM) from
the toolbar — the app validates format, validity dates and cert/key pairing via
a loopback TLS handshake, then stores only the file paths in
~/.config/dshare/cert.conf. With a certificate configured, theopensslcommand is never needed. Without one, a self-signed certificate is generated. If HTTPS is impossible (no certificate, noopenssl, or Qt built without SSL), a dialog asks you to choose explicitly — import a certificate, accept plain HTTP (with a permanent warning), or stay stopped. It never downgrades silently.
Release artifacts
Each release ships dshare_<version>_<arch>.deb, the linglong
*_binary.layer, and a SHA256SUMS. Verify before installing:
sha256sum -c SHA256SUMS
sudo apt install ./dshare_1.0.1_amd64.deb
ll-cli install ./io.github.zhutianhao.dshare_1.0.1.0_x86_64_binary.layerArtifacts are produced by scripts/build-release.sh (needs dpkg-dev and
linglong-builder). Both tools build natively, so run it once per target
architecture (amd64 / arm64 / loong64) and publish all outputs together.
CI: .github/workflows/release.yml builds amd64 + arm64 deb/layer and creates
the GitHub Release on every v* tag. Since GitHub runners are Ubuntu (no DTK6
packages), everything is compiled inside the linglong container via
linglong-builder from the official Ubuntu 24.04 repo. .github/workflows/ci.yml
does the same build as a compile check on pushes/PRs. loong64 needs a self-hosted
runner and is opt-in.
Build
mkdir build && cd build
cmake .. && make -j"$(nproc)"
./dshareRequires CMake ≥ 3.13, Qt6 (Core/Widgets/Network/HttpServer), DTK6
(Core/Gui/Widget/Log), and — only for the self-signed fallback — the openssl
command at runtime (skipped entirely once a certificate is imported).
Licensed under GPL-3.0.