跳至主要內容
版本:v8

從檔案系統載入照片

我們已實作拍照並儲存到檔案系統的功能。還缺少最後一項功能:照片儲存在檔案系統中,但我們需要一種方法來儲存每個檔案的指標,以便它們可以再次顯示在照片庫中。

幸運的是,這很容易:我們將利用 Capacitor 的 Preferences API,將我們的照片陣列儲存在鍵值儲存區中。

Preferences API

首先,在 src/composables/usePhotoGallery.tsusePhotoGallery 函式的頂部定義一個常數變數,它將作為儲存區的鍵。

const PHOTO_STORAGE = 'photos';

接下來,新增一個 cachePhotos 函式,將 Photos 陣列以 JSON 格式儲存至偏好設定。

const cachePhotos = () => {
Preferences.set({
key: PHOTO_STORAGE,
value: JSON.stringify(photos.value),
});
};

接下來,使用 Vue 的 watch 函式來監看 photos 陣列。每當修改陣列時(在此案例中為拍照或刪除照片),都會觸發 cachePhotos 函式。我們不僅可以重複使用程式碼,而且當應用程式使用者關閉或切換到不同的應用程式時也無關緊要 - 照片資料始終會儲存。

watch(photos, cachePhotos);

現在照片陣列資料已儲存,建立一個函式以在載入 Tab2 時擷取資料。首先,從偏好設定擷取照片資料,然後將每張照片的資料轉換為 base64 格式。

const loadSaved = async () => {
const photoList = await Preferences.get({ key: PHOTO_STORAGE });
const photosInPreferences = photoList.value ? JSON.parse(photoList.value) : [];

for (const photo of photosInPreferences) {
const file = await Filesystem.readFile({
path: photo.filepath,
directory: Directory.Data,
});
photo.webviewPath = `data:image/jpeg;base64,${file.data}`;
}

photos.value = photosInPreferences;
};

在行動裝置上(接下來會介紹!),我們可以將影像標籤的來源直接設定為檔案系統中的每個照片檔案 - <img src="x" /> - 來自動顯示它們。但是,在網頁上,我們必須從檔案系統中將每個影像讀取為 base64 格式,因為檔案系統 API 會將它們以 base64 格式儲存在 IndexedDB 中。

最後,我們需要一種方法來在載入照片庫頁面時呼叫 loadSaved 函式。為此,請使用 Vue 的 mounted 生命週期鉤子。稍早我們已從 Vue 匯入 onMounted

import { ref, onMounted, watch } from 'vue';

usePhotoGallery 函式中,新增 onMounted 函式並呼叫 loadSaved

onMounted(loadSaved);

就是這樣!我們已在 Ionic 應用程式中建立完整可在網頁上運作的照片庫功能。接下來,我們會將其轉換為適用於 iOS 和 Android 的行動應用程式!