📁

Flutterで簡単にファイルを保存する

2022/04/16に公開

file_saverというパッケージを使うと、簡単にファイルを保存することができる。
https://pub.dev/packages/file_saver
Webではダウンロード先を選択できるが、iOS, Androidではアプリ内のフォルダに強制的に保存されるので注意。
※Webアプリの場合、debugだと直接ダウンロードフォルダに保存されるが、リリースするとダウンロード先を選択できた。

The plugin is pretty simple and saves the file in Downloads folder in Windows, MacOS, Linux and directly downloads the file in Web, in iOS, the file is Saved in Application Documents Directory, and in Android it is saved in the applications files directory Android/data/your.package.name/file/your_file.extension. https://pub.dev/packages/file_saver

import文

import 'package:file_saver/file_saver.dart';

ファイルを保存するコード

await FileSaver.instance.saveFile(String name, Uint8List bytes, String ext, mimeType: MimeType);

nameはファイル名、bytesは実際のファイル(Uint8List形式)、extは拡張子を入力する。
mimeTypeの指定は必須ではないが、Webで使うなら指定したほうがいいっぽい(指定しないと拡張子が表示されない?かも。ちゃんと検証していないので確証はない)。
指定できるMimeTypeは以下のページを参照。
https://pub.dev/documentation/file_saver/latest/file_saver/MimeType.html

実際に使ったコード

CSVを保存するコード。

String csv = const ListToCsvConverter().convert(_qaList);
Uint8List bytes = const Utf8Encoder().convert(csv);
await FileSaver.instance.saveFile(widget.title, bytes, 'csv', mimeType: MimeType.CSV);

ListToCsvConverter().convertは以下のcsvのパッケージを使ったやつ。
https://pub.dev/packages/csv
Uint8Listを使うには、import 'dart:typed_data';が必要。
Utf8Encoder().convertを使うには、import 'dart:convert';が必要。
widget.titleとなっているやつは、遷移前の画面から持ってきたString値。

保存先を示す

Webでは保存先を選択できるが、iOSやAndroidでは保存先を選択できないため、ユーザーに保存先を表示したい。
そこで、Snackbarを使って保存先を表示するよう、コードを以下のように修正した。

String csv = const ListToCsvConverter().convert(_qaList);
Uint8List bytes = const Utf8Encoder().convert(csv);
String path = await FileSaver.instance
    .saveFile(widget.title, bytes, 'csv', mimeType: MimeType.CSV);
if (!kIsWeb) {
  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
    content: Text('$pathに保存されました'),
  ));
}

使ったアプリ

https://enoiu.com/app/clqa/
https://clqa.enoiu.com/

Discussion