@capacitor/filesystem
文件系统 API 提供类似 NodeJS 的 API,用于在设备上处理文件。
安装
npm install @capacitor/filesystem@latest-7
npx cap sync
Apple 隐私清单要求
苹果现在要求应用程序开发者为 API 使用指定批准的理由,以增强用户隐私。截至 2024 年 5 月 1 日,向 App Store Connect 提交应用时必须包含这些理由。
当在应用中使用此特定插件时,必须在 /ios/App 中创建 PrivacyInfo.xcprivacy 文件,或使用 VS Code 扩展生成该文件,并指定使用理由。
有关如何执行此操作的详细步骤,请参阅 Capacitor 文档。
对于此插件,所需的字典键是 NSPrivacyAccessedAPICategoryFileTimestamp,推荐理由是 C617.1。
PrivacyInfo.xcprivacy 示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<!-- 如果隐私信息文件已存在,请将此字典条目添加到数组中 -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
从 downloadFile 迁移到文件传输插件
自版本 7.1.0 起,文件系统插件中的 downloadFile 功能已被弃用,推荐使用新的 @capacitor/file-transfer 插件。
安装文件传输插件
npm install @capacitor/file-transfer@latest-7
npx cap sync
迁移示例
之前(使用文件系统插件):
import { Filesystem, Directory } from '@capacitor/filesystem';
await Filesystem.downloadFile({
url: 'https://example.com/file.pdf',
path: 'downloaded-file.pdf',
directory: Directory.Documents,
progress: true
});
// 进度事件
Filesystem.addListener('progress', (progress) => {
console.log(`已下载 ${progress.bytes} / ${progress.contentLength}`);
});
之后(使用文件传输插件):
import { FileTransfer } from '@capacitor/file-transfer';
import { Filesystem, Directory } from '@capacitor/filesystem';
// 首先使用文件系统获取完整的文件路径
const fileInfo = await Filesystem.getUri({
directory: Directory.Documents,
path: 'downloaded-file.pdf'
});
// 然后使用文件传输插件进行下载
await FileTransfer.downloadFile({
url: 'https://example.com/file.pdf',
path: fileInfo.uri,
progress: true
});
// 进度事件
FileTransfer.addListener('progress', (progress) => {
console.log(`已下载 ${progress.bytes} / ${progress.contentLength}`);
});
文件传输插件提供了更高的可靠性、更好的错误处理(包含特定错误代码),并增加了上传功能。
iOS
要让文件出现在文件应用中,您还必须在 Info.plist 中将以下键设置为 YES:
UIFileSharingEnabled(Application supports iTunes file sharing)LSSupportsOpeningDocumentsInPlace(Supports opening documents in place)
有关帮助,请阅读 配置 iOS。
Android
如果使用 Directory.Documents 或 Directory.ExternalStorage,在 Android 10 及更早版本中,此 API 需要将以下权限添加到您的 AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
有关设置 Android 权限的更多信息,请参阅 Android 指南 中的 设置权限。
请注意,Directory.ExternalStorage 仅在 Android 9 或更早版本中可用,而 Directory.Documents 在 Android 11 及更新版本中仅允许访问您的应用创建的文件/文件夹。
处理大文件时,您可能需要将 android:largeHeap="true" 添加到 AndroidManifest.xml 的 <application> 标签中。
理解目录和文件
iOS 和 Android 在文件之间有额外的隔离层,例如备份到云端的特殊目录,或用于存储文档的目录。文件系统 API 提供了一种简单的方法,将每个操作限定在设备上的特定特殊目录。
此外,文件系统 API 支持使用完整的 file:// 路径,或在 Android 上读取 content:// 文件。只需省略 directory 参数即可使用完整的文件路径。
示例
import { Filesystem, Directory, Encoding } from "@capacitor/filesystem";
const writeSecretFile = async () => {
await Filesystem.writeFile({
path: "secrets/text.txt",
data: "This is a test",
directory: Directory.Documents,
encoding: Encoding.UTF8,
});
};
const readSecretFile = async () => {
const contents = await Filesystem.readFile({
path: "secrets/text.txt",
directory: Directory.Documents,
encoding: Encoding.UTF8,
});
console.log("secrets:", contents);
};
const deleteSecretFile = async () => {
await Filesystem.deleteFile({
path: "secrets/text.txt",
directory: Directory.Documents,
});
};
const readFilePath = async () => {
// 这是一个使用完整文件路径读取文件的示例。使用此方法从返回文件 URI 的插件(例如相机)读取二进制数据(base64 编码)。
const contents = await Filesystem.readFile({
path: "file:///var/mobile/Containers/Data/Application/22A433FD-D82D-4989-8BE6-9FC49DEA20BB/Documents/text.txt",
});
console.log("data:", contents);
};
API
有关现有错误代码列表,请参阅 错误。
checkPermissions() => Promise<PermissionStatus>
检查读写权限。
仅在 Android 平台使用 Directory.Documents 或 Directory.ExternalStorage 时需要调用。
返回:
Promise<PermissionStatus>
自版本: 1.0.0
requestPermissions()
requestPermissions() => Promise<PermissionStatus>
请求读写权限。
仅在 Android 平台使用 Directory.Documents 或 Directory.ExternalStorage 时需要调用。
返回:
Promise<PermissionStatus>
自版本: 1.0.0
readFile(...)
readFile(options: ReadFileOptions) => Promise<ReadFileResult>
从磁盘读取文件。
| 参数 | 类型 |
|---|---|
options | |
返回:
Promise<ReadFileResult>
自版本: 1.0.0
readFileInChunks(...)
readFileInChunks(options: ReadFileInChunksOptions, callback: ReadFileInChunksCallback) => Promise<CallbackID>
分块读取磁盘文件。 仅原生平台支持(Web 端不可用)。 使用回调函数接收每个读取的数据块。 如果返回空数据块,表示文件已完全读取。
| 参数 | 类型 |
|---|---|
options | |
callback | |
返回: Promise<string>
自版本: 7.1.0
writeFile(...)
writeFile(options: WriteFileOptions) => Promise<WriteFileResult>
将文件写入设备的指定位置。
| 参数 | 类型 |
|---|---|
options | |
返回:
Promise<WriteFileResult>
自版本: 1.0.0
appendFile(...)
appendFile(options: AppendFileOptions) => Promise<void>
向设备指定位置的文件末尾追加内容。
| 参数 | 类型 |
|---|---|
options | |
自版本: 1.0.0
deleteFile(...)
deleteFile(options: DeleteFileOptions) => Promise<void>
从磁盘删除文件。
| 参数 | 类型 |
|---|---|
options | |
自版本: 1.0.0
mkdir(...)
mkdir(options: MkdirOptions) => Promise<void>
创建目录。
| 参数 | 类型 |
|---|---|
options | |
自版本: 1.0.0
rmdir(...)
rmdir(options: RmdirOptions) => Promise<void>
删除目录。
| 参数 | 类型 |
|---|---|
options | |
自版本: 1.0.0
readdir(...)
readdir(options: ReaddirOptions) => Promise<ReaddirResult>
获取目录下的文件列表(非递归)。
| 参数 | 类型 |
|---|---|
options | |
返回:
Promise<ReaddirResult>
自版本: 1.0.0
getUri(...)
getUri(options: GetUriOptions) => Promise<GetUriResult>