Flutter应用如何实现对SMB服务器的读写操作
Flutter实现SMB服务器读写操作方案
问题原因说明
SMB属于独立的局域网文件共享协议,和HTTP/HTTPS协议栈完全不兼容,因此你用Dio、HTTP包这类HTTP客户端是无法发起SMB请求的,之前的测试代码逻辑从底层协议层面就不成立。
实现方案
1. 引入适配的SMB依赖
当前Flutter生态中可直接使用flutter_smb2包,支持SMB2、SMB3协议,可覆盖绝大多数家用、商用SMB服务器的连接需求,同时支持Android、iOS、Windows、macOS平台。
你需要先在pubspec.yaml中添加依赖:
dependencies: flutter_smb2: ^latest_version
2. 基础操作示例代码
2.1 连接SMB服务器并认证
import 'package:flutter_smb2/flutter_smb2.dart'; Future<void> connectSMB() async { final smbClient = FlutterSmb2(); try { // 填入服务器配置参数 await smbClient.connect( host: '192.168.1.30', username: 'username', password: 'password', shareName: '共享文件夹名称', // 必填,对应SMB服务器上开放的共享文件夹名 domain: '', // 无域配置可留空 ); debugPrint('SMB连接成功'); } catch (e) { debugPrint('连接失败: $e'); } finally { // 业务结束后断开连接释放资源 await smbClient.disconnect(); } }
2.2 读取共享文件内容
Future<Uint8List?> readSMBFile(FlutterSmb2 client, String filePath) async { try { // filePath为共享文件夹下的相对路径,例如'documents/note.txt' final fileBytes = await client.readFile(filePath); return fileBytes; } catch (e) { debugPrint('读取文件失败: $e'); return null; } }
2.3 写入文件到SMB服务器
Future<bool> writeSMBFile(FlutterSmb2 client, String targetPath, Uint8List content) async { try { await client.writeFile(targetPath, content); return true; } catch (e) { debugPrint('写入文件失败: $e'); return false; } }
注意事项
- 连接SMB服务器时必须填写正确的共享文件夹名称,无法直接请求服务器根路径
- Android平台需要申请局域网访问权限,iOS需要配置
NSLocalNetworkUsageDescription权限 - 如果你的SMB服务器仅支持SMB1协议,可以选用
smb_client包适配,但SMB1协议安全性极低,建议优先升级服务器协议版本
内容的提问来源于stack exchange,提问作者Federico
相关产品推荐
相关产品推荐

