about
「Flutterで端末のキャッシュ領域に保存したファイルを開く方法」が見つからず苦労したのでまとめました
- Android/iOSのアプリ用キャッシュ領域にファイルを保存
- 端末デフォルトビューアで開く
path_provider
でパスを取得してopen_file
で開けばOKでした。
経緯
実装のコンテキストは以下
-
要件
- AWS S3にアップロードしたPDFを端末に保存するとき、オリジナルのファイル名にしたい
-
問題
- S3に上げた時点でランダムなファイル名になる
- そのまま開くとランダム名で保存することになる
-
解決案
- 一度キャッシュ領域に、指定した名前で保存
- そのファイルを開けば端末のPDF Viewerで保存したときもファイル名のハンドリングが可能
- (URLをPDF Viewerに渡す場合と違い、ダウンロード完了まで開けなくなります)
sample
サンプルプロジェクトは以下
https://github.com/kanari3/cache_and_open_document_flutter
path_providerのサンプルアプリに、今回の要件を追加した形になっています。

方法
open_file
を使えばOKです
https://pub.dev/packages/open_file
url_launcherで開こうとしていました。
OpenFile.open()でパスを渡せばOSに応じて適切に解釈してくれます。
typeとutiのオプションをつけることもできます。
大変だったこと
url_launcherが、内部領域へのアクセスに対応していなかった
URLを渡してビューアを開くときに使っていたので、url_launcherで検証していました。
保存したパスを渡して検証していましたが、必ず例外に入るようです。
※ 上手く設定すれば file://やcontents://でアクセスできる方法があるかも
Android / iOS両方に対応したい
結果としては、path_providerを使えば楽
OS毎にメソッドチャンネルを書こうとしていた。
試行錯誤中はいろいろな保存先を試す必要があった
キャッシュ領域への保存はできるが、読み出しがうまくいかなかったので
/sdcard/
以下に保存することも考えた。(Android)
この場合、パーミッション管理とiOSの分岐が必要になる。
また、閲覧しただけで保存までされてしまうので削除が必要になる。
おわり
ググり力が足りなくて1日溶かしてしまった。
既存プロジェクトでいろいろ試すコストが耐えられなくなったので、
サンプルプロジェクトを作って全パターン自動で試したりしました。