ビルド後のtauriアプリでローカルの画像を参照する
Tauriでローカル画像ファイルを表示しようとした...
アプリの背景画像をユーザーが直接好みの背景に変えれるようにローカルから画像ファイルを読み込む処理を実装してみようと思いました。
しかしビルドする前のアプリだと表示されるのにビルド後のアプリは上手く表示されず困っていました。
この記事では、TauriのconvertFileSrc
関数とallowlist
設定を使用して、ローカル画像を問題なく表示する方法を解説します。
画像表示の課題と解決策
当初、画像の表示にはBase64に変換して表示をしていましたが、久しぶりにTauriをビルドするとアプリではこれらの方法だと表示できないことを知りました。(久しぶりは良くないよね)
解決する方法が見つからず半日途方に暮れている時にXで困ってる趣旨を呟くとFF外のさすらいのエンジニアが「TauriにはconvertFileSrc
という便利な関数が用意されている」とご教示をいただきました。
この関数を使えば、ローカルファイルパスをTauriのWebビューで直接アクセス可能なURLに変換できるらしい。
また、これと合わせてtauri.conf.json
にallowlist
設定を追加することで、セキュリティを確保しながらローカルファイルの読み込みが可能になります。
convertFileSrc
関数の概要
convertFileSrc
関数は、デバイス内のファイルパスをWebビューで読み込み可能なURLに変換するためのものです。
例えば、$HOME/<任意のパス>/images/background.jpg
のようなファイルパスをfile://
ではなく、Tauriが認識できるプロトコルでアクセスできるようにします。
次に、設定方法を詳しく説明します。
tauri.conf.json
の設定
convertFileSrc
を使用してローカル画像を読み込むためには、tauri.conf.json
の設定にallowlist
オプションで読み込み範囲を明示する必要があります。
ここでは、画像ディレクトリ$HOME/<任意のパス>/images
を設定します。
{
"tauri": {
"security": {
"csp": "default-src 'self'; img-src 'self' asset: http://asset.localhost;"
},
"allowlist": {
"protocol": {
"asset": true,
"assetScope": [
"$HOME/<任意のパス>/images",
"$HOME/<任意のパス>/images/*"
]
}
}
}
}
allowlist.protocol.asset
をtrue
にすることで、Tauriが画像ファイルを認識できるようになります。
allowlist.protocol.assetScope
はアプリがアクセスを許可するローカルパスの範囲を指定します。ここでは、$HOME/<任意のパス>/images
内のファイルを指定しています。
Reactのコード
次に、Reactでこの設定を使って画像を表示する方法を紹介します。@tauri-apps/api/path
からhomeDir
を取得し、convertFileSrc
を使って画像パスを変換します。
import { useEffect, useState } from "react";
import { convertFileSrc } from "@tauri-apps/api/tauri";
import { homeDir } from "@tauri-apps/api/path";
function App() {
const [imageUrl, setImageUrl] = useState("");
useEffect(() => {
async function loadImage() {
try {
const home = await homeDir();
const filePath = `${home}<任意のパス>/images/background.jpg`;
const assetUrl = convertFileSrc(filePath);
setImageUrl(assetUrl);
} catch (error) {
console.error("Error loading image:", error);
}
}
loadImage();
}, []);
return (
<div>
{imageUrl && <img src={imageUrl} alt="Bg Image" />}
</div>
);
}
export default App;
-
convertFileSrc
で取得したassetUrl
は、Reactコンポーネント内の<img>
タグに直接使用できます。 - これで、
file://
プロトコルを使用することなく、TauriアプリのWebビューで画像を表示できます。
設定変更後の再ビルド
npm run tauri build
たぶんいけるはず。
なんか出たエラー系
- Tauriで画像を読み込む際に403エラーが出る場合、
tauri.conf.json
のallowlist
とcsp
設定が適切であるか確認したほうがいいです。 - そもそもエディター使ってたらwarning出るかもしれんけど、古いドキュメント見てassetProtocolを使おうとしたら怒られた。古いバージョンのTauriや新しいバージョンで、構文が変更されている場合があるから、最新の公式ドキュメントを確認した方がいいです。
結論
convertFileSrc
とallowlist
設定を使用することで、ローカルファイルの画像をTauriアプリ上で表示できるようになりました。
Discussion