Flutter和鸿蒙如何保存文件到下载文件夹

在Flutter和鸿蒙开发中,如何将文件保存到系统的下载文件夹?具体实现方式有哪些差异?Flutter是否可以通过path_provider插件实现,而鸿蒙需要调用特定API?能否提供两种平台下的代码示例,并说明是否需要额外权限配置?

2 回复

Flutter:使用path_provider获取下载目录路径,结合dart:io写入文件。示例代码:

Directory? downloadsDir = await getDownloadsDirectory();
File file = File('${downloadsDir!.path}/filename.txt');
await file.writeAsString('content');

鸿蒙:通过FileManager获取下载目录URI,使用ohos.file.fs写入。示例代码:

String downloadUri = FileManager.getUri(FileManager.DIRECTORY_DOWNLOADS);
File file = new File(downloadUri + "/filename.txt");
file.writeString('content');

更多关于Flutter和鸿蒙如何保存文件到下载文件夹的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 和鸿蒙系统中,保存文件到下载文件夹的方法有所不同。以下是具体实现:

Flutter(Android/iOS)

使用 path_providerdio(或原生 File)库:

  1. 添加依赖(pubspec.yaml):
dependencies:
  path_provider: ^2.1.1
  dio: ^5.3.0
  permission_handler: ^11.0.0 # 需要权限时
  1. 实现代码
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:dio/dio.dart';

Future<void> saveToDownloadFolder() async {
  // 获取下载目录路径
  Directory? downloadsDir = await getDownloadsDirectory();
  
  // 创建文件路径
  String filePath = '${downloadsDir!.path}/example.txt';
  
  // 写入文件内容
  File file = File(filePath);
  await file.writeAsString('Hello, this is a test file.');
  
  // 如果是网络文件下载,使用Dio:
  // await Dio().download(
  //   'https://example.com/file.zip',
  //   filePath,
  // );
}

注意

  • Android需要添加存储权限(AndroidManifest.xml):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • iOS需要配置权限(Info.plist)并启用iCloud Drive。

鸿蒙(HarmonyOS)

使用 FileManagerMediaLibrary 能力:

  1. 配置权限(module.json5):
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.WRITE_MEDIA"
      }
    ]
  }
}
  1. 实现代码(ArkTS):
import fs from '@ohos.file.fs';
import mediaLibrary from '@ohos.multimedia.mediaLibrary';

async function saveToDownloadFolder() {
  // 获取媒体库实例
  let media = mediaLibrary.getMediaLibrary();
  
  // 创建文件资源
  let fileAsset = await media.createAsset(
    mediaLibrary.MediaType.FILE,
    'example.txt',
    mediaLibrary.DirectoryType.DIR_DOWNLOAD
  );
  
  // 写入文件内容
  let fd = await fileAsset.open('Rw');
  await fs.write(fd, 'Hello, this is a test file.');
  await fd.close();
}

关键差异

  • Flutter:跨平台方案,需处理平台差异和权限
  • 鸿蒙:使用原生媒体库API,需声明对应权限

建议根据目标平台选择对应实现,并注意权限申请和错误处理。

回到顶部