如何创建一个按钮,允许用户下载特定的文件Flutter

t98cgbkg  于 2023-02-20  发布在  Flutter
关注(0)|答案(1)|浏览(156)

我创建了一个flutter应用程序,我有一个CSV文件,用作用户的模板。我想提供一个按钮,允许用户下载此CSV文件,这样他们就可以使用它来拥有CSV文件,已经有我们的模板。
问题是我不知道最好的方法是先在线存储文件,然后获取URL并在flutter下载器URL上使用它,还是将其保存在本地代码资产中,当用户点击下载模板按钮时引用该文件。(我不知道这个选项是否可行),下载总是失败。我使用flutter_downloader包。
如何解决这个问题?
这是我的代码,我的代码有问题吗?

/// Check if the file exist or not
if (await File(externalDir!.path + "/" + fileName).exists()) {
  OpenFilex.open(externalDir!.path + "/" + fileName);
} else {
  /// Download the file if it doesn't exist in the user's device
  final String localPath = (await getApplicationDocumentsDirectory()).path;
  /// Dummy file name I want use (it exist in my asset dir"
  const String fileName = 'add.png';

  final data = await rootBundle.load('assets/logo/add.png');
  final bytes = data.buffer.asUint8List();

  final File file = File('$localPath/$fileName');
  await file.writeAsBytes(bytes);

  /// Download the file
  final taskId = await FlutterDownloader.enqueue(
    url: '',
    savedDir: localPath,
    fileName: fileName,
    showNotification: true,
    openFileFromNotification: true,
  );
}
sigwle7e

sigwle7e1#

要从AppBundle加载文件,然后将其保存到用户电话,请执行以下操作:

  • 将文件放在assets/filename.csv中,并在pubspec中声明它,如下所示:
flutter:
  assets:
   - assets/filename.csv
  • 在代码中加载文件:
import 'package:flutter/services.dart' show ByteData, rootBundle;

(...)
var data = (await rootBundle.load('assets/filename.csv)).buffer.asInt8List();
  • 将数据保存到文件中(如果要复制精确的代码,则需要路径提供程序包):
import 'package:path_provider/path_provider.dart' as pp;
(...)
var path = (await pp.getApplicationDocumentsDirectory()).path;
var file = File('$path/filename.csv');
await file.writeAsBytes(data, flush: true);

编辑:正如Stephan正确指出的那样,如果你想把文件存储在下载文件夹中,你会发现关于那个here的附加信息。谢谢Stephan!

相关问题