Flutter云存储插件nextcloud的使用

Flutter云存储插件nextcloud的使用

nextcloud 是一个用Dart编写的Nextcloud API客户端。

如果你想要基于Nextcloud实现一个Flutter应用,可以查看一下 Neon 项目。该项目为这种用途提供了一个框架,并且也在开发这个包。

使用方法

认证

有多种方式来进行认证。

首先,HTTP基本认证可以通过正常的用户凭据(电子邮件和其他标识符)进行:

final client = NextcloudClient(
    Uri.parse('http://localhost'),
    loginName: 'admin',
    password: 'admin',
);

其次,HTTP承载认证可以通过应用密码进行:

final client = NextcloudClient(
    Uri.parse('http://localhost'),
    loginName: 'admin',
    appPassword: 'xxxxx-xxxxx-xxxxx-xxxx-xxxxx',
);

并不是所有的端点都支持仅通过HTTP基本认证,因此建议使用通过Web界面直接由用户获取的应用密码,或者使用登录流程。一些端点可能不需要任何认证,或者在可选认证的情况下提供扩展信息。

注意 Flutter应用程序可能需要额外配置才能进行HTTP请求。

端点

除非应用安装并启用在服务器上(并且支持版本),否则API请求可能不会正常工作。

为了更容易地了解可用的端点,你可以浏览服务器OpenAPI文档,但请注意,该包可能与之不同步。 或者你也可以访问 https://pub.dev/documentation/nextcloud/latest

端点按应用分组,大多数应用也会再次分组它们的端点。 它们可以通过 NextcloudClient 上的getter访问。

例如,请参阅 example/example.dart

兼容性/支持策略

组件 支持版本
Server (2) 28 - 30
Cookbook app 0.11
User account deletion app 2.4 - 2.6
News app 25
Notes app 4.8 - 4.11
Notifications app 28 - 30
Talk app 18 - 20
Tables app 0.6 - 0.8
NextPush app 1.4 - 1.5
  1. 其他版本可能也受支持,或者至少大部分功能正常工作,但我们不针对这些版本进行测试。
  2. Server 包括以下应用:comments, core, dashboard, dav, files, files_external, files_reminders, files_sharing, files_trashbin, files_versions, provisioning_api, settings, sharebymail, systemtags, theming, updatenotification, user_ldap, user_status, weather_status, webhook_listeners 和 WebDAV。

我们旨在支持所有当前维护的服务器版本以及支持这些服务器版本的所有应用版本。 当前维护的服务器版本可以在这里找到。 一旦一个服务器版本成为EOL(End of Life),我们将停止对其的支持。

为了确保此包与受支持的服务器版本兼容,我们运行API单元测试。 由于我们没有覆盖所有端点,我们不能声称对未测试的端点具有兼容性。 即使存在某个端点的单元测试,我们也无法保证它在每种情况下都能正常工作。

请报告任何兼容性问题(如果您使用的是兼容的服务器版本),并随时添加您依赖的端点的单元测试。 这将增加我们的测试覆盖率,使每个人都能更自信地使用这些端点。

完整示例

以下是一个完整的示例代码,展示了如何使用 nextcloud 插件进行基本的用户信息获取。

import 'package:nextcloud/nextcloud.dart';
import 'package:nextcloud/provisioning_api.dart';

Future<void> main() async {
  // 创建一个Nextcloud客户端实例
  final client = NextcloudClient(
    Uri.parse('http://localhost'), // Nextcloud服务器地址
    loginName: 'admin',           // 登录用户名
    password: 'admin',            // 登录密码
  );

  // 获取当前用户的详细信息
  final response = await client.provisioningApi.users.getCurrentUser();

  // 打印当前用户名
  print(response.body.ocs.data.id); // 将打印 `admin`
}

更多关于Flutter云存储插件nextcloud的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云存储插件nextcloud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中集成Nextcloud云存储功能,通常需要使用到Nextcloud提供的官方SDK或者通过HTTP请求直接与Nextcloud的WebDAV API进行交互。以下是一个通过HTTP请求与Nextcloud的WebDAV API进行基本文件操作的示例代码,包括上传和下载文件。

首先,确保你的Flutter项目中已经添加了必要的依赖,例如http包用于发送HTTP请求。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保版本是最新的

然后,运行flutter pub get来安装依赖。

接下来,是示例代码,用于展示如何通过HTTP请求与Nextcloud的WebDAV API进行文件上传和下载。

import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;

class NextcloudClient {
  final String baseUrl;
  final String username;
  final String password;

  NextcloudClient({required this.baseUrl, required this.username, required this.password});

  Future<String> _getAuthToken() async {
    var url = Uri.parse('$baseUrl/ocs/v2.php/apps/cloud_id/api/v1/tokens');
    var body = jsonEncode({
      'password': password,
      'username': username,
    });

    var response = await http.post(url, headers: {'Content-Type': 'application/json'}, body: body);

    if (response.statusCode == 200) {
      var data = jsonDecode(response.body);
      return data['ocs']['data']['token'];
    } else {
      throw Exception('Failed to authenticate: ${response.statusCode}');
    }
  }

  Future<void> uploadFile(File file, String remotePath) async {
    var token = await _getAuthToken();
    var url = Uri.parse('$baseUrl/remote.php/dav/files/$username/$remotePath');
    var request = http.MultipartRequest('POST', url);

    var fileStream = new File(file.path).openRead();
    var multipartFile = new http.MultipartFile.fromStream(
      'file',
      fileStream,
      file.lengthSync(),
      filename: file.path.split('/').last,
      contentType: MediaType('application', 'octet-stream'),
    );

    request.files.add(multipartFile);
    request.headers['OCS-APIREQUEST'] = 'true';
    request.headers['Authorization'] = 'Bearer $token';

    var response = await request.send();
    if (response.statusCode != 201 && response.statusCode != 204) {
      throw Exception('Failed to upload file: ${response.statusCode}');
    }

    response.stream.byteStreams.single.listen((value) {});
  }

  Future<File> downloadFile(String remotePath, String localPath) async {
    var token = await _getAuthToken();
    var url = Uri.parse('$baseUrl/remote.php/dav/files/$username/$remotePath');
    var response = await http.get(url, headers: {'Authorization': 'Bearer $token'});

    if (response.statusCode == 200) {
      var file = File(localPath);
      await file.writeAsBytes(response.bodyBytes);
      return file;
    } else {
      throw Exception('Failed to download file: ${response.statusCode}');
    }
  }
}

void main() async {
  var client = NextcloudClient(
    baseUrl: 'https://your-nextcloud-instance.com',
    username: 'your-username',
    password: 'your-password',
  );

  // 上传文件
  var fileToUpload = File('path/to/your/local/file.txt');
  try {
    await client.uploadFile(fileToUpload, 'path/to/remote/file.txt');
    print('File uploaded successfully!');
  } catch (e) {
    print('Error uploading file: $e');
  }

  // 下载文件
  var localFilePath = 'path/to/save/downloaded/file.txt';
  try {
    var downloadedFile = await client.downloadFile('path/to/remote/file.txt', localFilePath);
    print('File downloaded successfully: ${downloadedFile.path}');
  } catch (e) {
    print('Error downloading file: $e');
  }
}

注意事项

  1. 安全性:在实际应用中,不要硬编码用户名和密码。考虑使用安全存储或环境变量来管理敏感信息。
  2. 错误处理:示例代码中的错误处理较为简单,实际应用中可能需要更详细的错误处理和用户反馈。
  3. API版本:Nextcloud的API可能会随时间更新,确保你使用的API版本与Nextcloud服务器兼容。
  4. 依赖管理:确保http包的版本是最新的,或者根据你的需求选择适合的版本。

这段代码展示了如何通过HTTP请求与Nextcloud的WebDAV API进行基本的文件上传和下载操作。根据实际需求,你可能需要扩展或修改这些功能。

回到顶部