import 'dart:io'; import 'package:args/args.dart'; import 'package:file/local.dart'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart'; import 'package:shelf_dav/shelf_dav.dart'; void main(List args) async { var parser = ArgParser(); parser.addOption('port', abbr: 'p', defaultsTo: '8800', help: '服务运行端口号'); parser.addOption('dir', abbr: 'd', defaultsTo: './repo/', help: '文件存储路径'); parser.addOption('user', abbr: 'u', help: 'DAV服务用户名', mandatory: true); parser.addOption('auth', abbr: 'a', help: 'DAV服务密码', mandatory: true); var argResults = parser.parse(args); if (args.isEmpty) { stdout.writeln(parser.usage); return; } final fs = const LocalFileSystem(); final rootDir = fs.directory(argResults.option('dir') ?? './repo/'); if (!rootDir.existsSync()) { rootDir.createSync(recursive: true); } var user = argResults.option('user')!; final config = DAVConfig( root: rootDir, prefix: '/dav', allowAnonymous: false, // 1G maxUploadSize: 1024 * 1024 * 1024, readOnly: false, propertyStorageType: PropertyStorageType.file, authenticationProvider: BasicAuthenticationProvider.plaintext( users: {user: argResults.option('auth')!}, ), ); final dav = ShelfDAV.withConfig(config); final ip = InternetAddress.anyIPv4; final port = int.parse(argResults.option('port') ?? '8800'); final server = await serve( (request) { if (request.method == 'GET' && request.url.path == 'info/$user') { return getInfo(rootDir); } return dav.handler.call(request); }, ip, port, ); print('WebDAV server listening on port ${server.port}'); } Response getInfo(Directory dir) { var du = Process.runSync('du', [ '-h', '--time', dir.absolute.path, ]).stdout.toString(); var result = []; for (var line in du.split('\n')) { var parts = line.split(dir.absolute.path); if (parts.length == 2) { if (parts.last.trim().isEmpty) { result.insert(0, '${parts.first}总占用\n'); } else { result.add('${parts.first}${Uri.decodeComponent(parts.last)}'); } } } return Response.ok( result.join('\n'), headers: {'content-type': 'text/plain'}, ); }