HarmonyOS 5.0.0 或以上:实现跨设备远程文件发送(本机选择 → 对端保存)
📌 场景介绍
分布式文件协同适用于:
-
在手机选择文件,发送到平板保存或打开
-
IoT 场景中将日志、配置从主设备推送到其他终端
-
多端文件流转,实现“无感传送”
本篇实现:
-
获取远程设备 ID
-
使用分布式虚拟文件系统(DMS)访问远程路径
-
将本地文件拷贝到对端
/storage/media
或指定路径 -
异步回调结果
🧱 页面结构
/entry/src/main/ets
├── pages/
│ └── RemoteFileTransferDemo.ets // 跨端文件发送演示
└── assets/
└── demo.txt // 示例本地文件
🧩 RemoteFileTransferDemo.ets 示例页面
import fs from '@ohos.file.fs'
import dms from '@ohos.distributedFile.dfs'
import distributedHardware from '@ohos.distributedHardware.deviceManager'
@Entry
@Component
struct RemoteFileTransferDemo {
@State status: string = '未开始'
@State devices: Array<{ id: string, name: string }> = []
private localFile: string = '/data/storage/el2/base/assets/demo.txt'
private remoteFileName: string = 'received_demo.txt'
aboutToAppear() {
this.initDeviceDiscovery()
}
private async initDeviceDiscovery() {
distributedHardware.createDeviceManager('com.example.harmony', (err, dm) => {
if (err) return
dm.on('deviceFound', (device) => {
if (!this.devices.find(d => d.id === device.deviceId)) {
this.devices.push({ id: device.deviceId, name: device.deviceName })
}
})
dm.startDeviceDiscovery({
subscribeId: 'remoteCopy',
capability: 'dvkit',
isWakeRemote: true,
medium: 1
})
})
}
private async sendFileToDevice(deviceId: string) {
try {
// 读取本地文件内容
const stat = await fs.stat(this.localFile)
const f = await fs.open(this.localFile, fs.OpenMode.READ_ONLY)
const buf = new Uint8Array(stat.size)
await fs.read(f.fd, buf)
await fs.close(f.fd)
// 获取远端分布式路径
const remotePath = `/mnt/hmdfs/${deviceId}/files/${this.remoteFileName}`
const wf = await fs.open(remotePath, fs.OpenMode.CREATE | fs.OpenMode.WRITE_ONLY | fs.OpenMode.TRUNC)
await fs.write(wf.fd, buf)
await fs.close(wf.fd)
this.status = `✅ 文件已发送到 ${deviceId}`
} catch (err) {
this.status = '❌ 发送失败:' + JSON.stringify(err)
console.error('Send error:', err)
}
}
build() {
Column() {
Text("📤 跨设备文件发送").fontSize(22).margin(20)
Text(this.status).fontSize(14).fontColor('#888').marginBottom(10)
ForEach(this.devices, (d) => {
Button(`发送到 ${d.name}`).onClick(() => this.sendFileToDevice(d.id)).margin(6)
})
Text("📁 本地发送文件路径:").fontSize(12).marginTop(20)
Text(this.localFile).fontSize(12).fontColor('#999')
}
.padding(20)
.height('100%')
.scrollable(true)
}
}
✅ 效果说明
-
自动发现分布式设备
-
点击目标设备,即将本地 demo.txt 通过分布式路径
/mnt/hmdfs/设备ID/files/
拷贝至对端 -
对端文件系统将接收到
received_demo.txt
-
无需使用 Socket/蓝牙,完全走鸿蒙分布式文件通道
🔧 拓展建议
-
添加进度条、文件大小判断、成功提示动画
-
支持文件列表选择与批量发送
-
封装为
FileShareService
,支持任意业务调用 -
搭配跨端 Toast 或通知反馈接收状态