You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何将Base64字符串保存为PDF至手机本地存储?

实现PDF从私有目录保存到手机本地存储

要把APP私有目录中的PDF保存到手机公共存储(比如下载文件夹),可以按以下步骤实现:

1. 添加依赖包

在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  path_provider: ^2.1.1
  permission_handler: ^10.2.0

执行flutter pub get完成依赖安装。

2. 配置权限

Android端

在android/app/src/main/AndroidManifest.xml中添加权限声明:

<!-- Android 10及以下版本需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- Android 13+ 版本需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_DOCUMENTS" />

iOS端

在ios/Runner/Info.plist中添加存储权限说明:

<key>NSDownloadsDirectoryUsageDescription</key>
<string>需要访问下载目录以保存PDF文件</string>

3. 实现保存逻辑

以下是完整的保存代码示例:

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

Future<void> savePdfToPublicStorage() async {
  // 1. 检查并申请存储权限
  PermissionStatus status;
  if (Platform.isAndroid) {
    final androidSdk = await (await DeviceInfoPlugin().androidInfo).version.sdkInt;
    status = androidSdk >= 33 
        ? await Permission.manageExternalStorage.request() 
        : await Permission.storage.request();
  } else {
    status = await Permission.storage.request();
  }

  if (!status.isGranted) {
    // 权限未通过,可添加提示用户开启权限的逻辑
    return;
  }

  // 2. 获取公共存储的下载目录路径
  Directory? downloadsDir;
  if (Platform.isAndroid) {
    downloadsDir = await getExternalPublicDirectory(DirectoryDownloads);
  } else if (Platform.isIOS) {
    // iOS沙盒限制严格,先保存到应用文档目录,如需系统下载目录需用分享功能
    downloadsDir = await getApplicationDocumentsDirectory();
  }

  if (downloadsDir == null) return;

  // 3. 定义原文件和目标文件路径
  const originalPath = '/data/user/0/com.example.flutter_pdf_proj/app_flutter/example.pdf';
  final targetPath = '${downloadsDir.path}/example.pdf';

  // 4. 读取原PDF文件字节
  final originalFile = File(originalPath);
  if (!await originalFile.exists()) return;
  final pdfBytes = await originalFile.readAsBytes();

  // 5. 写入目标文件
  final targetFile = File(targetPath);
  await targetFile.writeAsBytes(pdfBytes);

  // 保存成功后的提示逻辑
  print('PDF已保存至:$targetPath');
}

注意事项

  • Android 13+ 写入公共下载目录无需特殊权限,直接使用getExternalPublicDirectory即可,部分定制化设备可能需额外适配。
  • iOS 系统中,若需将文件保存到系统级下载目录,建议通过分享功能让用户手动选择保存位置,或使用文档选择器类插件实现。
  • 保存完成后,可通过手机自带的文件管理器在对应目录找到该PDF。

内容的提问来源于stack exchange,提问作者Siva M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:10:51