跳至主要内容
版本:v8

从文件系统加载照片

我们已经实现了将照片拍摄和保存到文件系统。还缺少一个功能:照片存储在文件系统中,但我们需要一种方法来保存指向每个文件的指针,以便它们可以在照片库中再次显示。

幸运的是,这很简单:我们将利用 Capacitor 首选项 API 在键值存储中存储我们的照片数组。

首选项 API

首先定义一个常量变量,它将充当存储的键

export class PhotoService {
public photos: UserPhoto[] = [];
private PHOTO_STORAGE: string = 'photos';

// other code
}

接下来,在 addNewToGallery 函数的末尾,添加对 Preferences.set() 的调用以保存照片数组。通过在此处添加它,每次拍摄新照片时都会保存照片数组。这样,无论应用程序用户何时关闭或切换到其他应用程序,所有照片数据都会被保存。

Preferences.set({
key: this.PHOTO_STORAGE,
value: JSON.stringify(this.photos),
});

保存照片数组数据后,创建一个名为 loadSaved() 的函数,该函数可以检索该数据。我们使用相同的键以 JSON 格式检索照片数组,然后将其解析为数组

public async loadSaved() {
// Retrieve cached photo array data
const { value } = await Preferences.get({ key: this.PHOTO_STORAGE });
this.photos = (value ? JSON.parse(value) : []) as UserPhoto[];

// more to come...
}

在移动设备上(接下来会介绍!),我们可以直接将图像标记的源代码 - <img src="x" /> - 设置为文件系统上的每个照片文件,从而自动显示它们。但是,在 Web 上,我们必须使用 Photo 对象上的新 base64 属性,将每个图像从文件系统读取到 base64 格式。这是因为文件系统 API 在后台使用 IndexedDB。以下是要在刚刚添加的 loadSaved() 函数中添加的代码

// Display the photo by reading into base64 format
for (let photo of this.photos) {
// Read each saved photo's data from the Filesystem
const readFile = await Filesystem.readFile({
path: photo.filepath,
directory: Directory.Data,
});

// Web platform only: Load the photo as base64 data
photo.webviewPath = `data:image/jpeg;base64,${readFile.data}`;
}

之后,在 tab2.page.ts 中调用此新方法,以便当用户首次导航到选项卡 2(照片库)时,所有照片都将加载并显示在屏幕上。

async ngOnInit() {
await this.photoService.loadSaved();
}

就是这样!我们在 Ionic 应用程序中构建了一个完整的照片库功能,该功能在 Web 上运行。接下来,我们将把它变成适用于 iOS 和 Android 的移动应用程序!