gpt4 book ai didi

flutter - 如何下载pdf到移动设备flutter

转载 作者:行者123 更新时间:2023-12-02 15:48:58 25 4
gpt4 key购买 nike

你好,我有这个方法可以从 api 获取 pdf 并返回解码文件,我可以在点击时显示它,但我想将它保存到设备。这是我解码pdf的方法:

  Future<File> _storeFile(String bytes) async {
final filename = "${_dokument?.naziv}";
final bytes = _dokument?.bytes;
Uint8List base64Decode(String source) => base64.decode(source);

await checkDocumentFolder();

String dir = directory!.path;

//final file = File('${dir.path}/$filename');
final file = File('$dir/$filename');
//var pdfBytes = bytes?.split(",")[1];
if (!file.existsSync()) file.create();
var pdfBytes = bytes?.substring(bytes.indexOf(",") + 1);
print(pdfBytes);
await file.writeAsBytes(base64Decode(pdfBytes!), flush: true);

return file;
}

所以我的问题是,我能否以某种方式将从该方法返回的文件保存到移动设备。

最佳答案

有几件事需要考虑。

保存文件在各种设备上有所不同。对于 PDF 文件,我假设您希望用户可以轻松访问它们。要做到这一点,它不能存储在应用程序的文件中 - 用户自己需要大量挖掘才能找到该文件。

它还需要一些权限,其中一些直接在特定于平台的文件中配置,一些必须在运行时向用户请求。 Permission Handler软件包对这项工作派上用场。

那么,下面是实现它的方法:

import 'dart:io';

import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

iOS

Future<void> saveFile(String fileName) async {
var file = File('');

// Platform.isIOS comes from dart:io
if (Platform.isIOS) {
final dir = await getApplicationDocumentsDirectory();
file = File('${dir.path}/$fileName');
}

要使其在 iOS 上运行,您必须向 ios/Runner/Info.plist 文件添加 2 个键。

<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>

Android

if (Platform.isAndroid) {
var status = await Permission.storage.status;
if (status != PermissionStatus.granted) {
status = await Permission.storage.request();
}
if (status.isGranted) {
const downloadsFolderPath = '/storage/emulated/0/Download/';
Directory dir = Directory(downloadsFolderPath);
file = File('${dir.path}/$fileName');
}
}

另一方面,对于 Android,您需要做更多的事情。

首先,需要在android/app/build.gradle文件中设置合适的compileSdkVersion。在我写这篇文章时 - 它应该设置为 33

android/app/src/main/AndroidManifest.xml 中也需要两行,就在 manifest 的正下方

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

当然,正如在代码中所见 - 我们还需要请求用户的许可。

写入文件

  // load file that you want to save on user's phone
// it can be loaded from whenever you want, e.g. some API.
final byteData = await rootBundle.load('assets/$fileName');
try {
await file.writeAsBytes(byteData.buffer
.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
} on FileSystemException catch (err) {
// handle error
}
}

File Saver package 将文件保存到应用程序的数据中,因此用户不会那么容易找到它。它也是由未经验证的上传者发布的,所以我一定要记住这一点。

关于flutter - 如何下载pdf到移动设备flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73205824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com