LoginSignup
4
1

More than 1 year has passed since last update.

Flutterでキャッシュに保存したファイルを開く

Posted at

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://でアクセスできる方法があるかも:thinking:

Android / iOS両方に対応したい

結果としては、path_providerを使えば楽
OS毎にメソッドチャンネルを書こうとしていた。

試行錯誤中はいろいろな保存先を試す必要があった

キャッシュ領域への保存はできるが、読み出しがうまくいかなかったので
/sdcard/以下に保存することも考えた。(Android)
この場合、パーミッション管理とiOSの分岐が必要になる。
また、閲覧しただけで保存までされてしまうので削除が必要になる。

おわり

ググり力が足りなくて1日溶かしてしまった。
既存プロジェクトでいろいろ試すコストが耐えられなくなったので、
サンプルプロジェクトを作って全パターン自動で試したりしました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1