@capacitor/filesystem
文件系统API提供了一个类NodeJS的API,用于在设备上处理文件。
安装
npm install @capacitor/filesystem
npx cap sync
Apple隐私清单要求
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>
<!-- 如果PrivacyInfo文件已存在,请将此字典条目添加到数组中 -->
<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
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';
// 首先使用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
(应用程序支持iTunes文件共享
)LSSupportsOpeningDocumentsInPlace
(支持在位置打开文档
)
阅读配置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及更新版本上仅允许访问您的应用创建的文件/文件夹。
处理大文件可能需要您在AndroidManifest.xml
的<application>
标签中添加android:largeHeap="true"
。
理解目录和文件
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: '这是一个测试',
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('秘密:', 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('数据:', contents);
};
API
有关现有错误代码的列表,请参阅错误。
checkPermissions()
checkPermissions() => Promise<PermissionStatus>
检查读/写权限。
仅在Android上使用Directory.Documents
或
Directory.ExternalStorage
时需要。
返回:
Promise<PermissionStatus>
Since: 1.0.0
requestPermissions()
requestPermissions() => Promise<PermissionStatus>
请求读/写权限。
仅在Android上使用Directory.Documents
或
Directory.ExternalStorage
时需要。
返回:
Promise<PermissionStatus>
Since: 1.0.0
readFile(...)
readFile(options: ReadFileOptions) => Promise<ReadFileResult>
从磁盘读取文件
参数 | 类型 |
---|---|
options |
|
返回:
Promise<ReadFileResult>
Since: 1.0.0
readFileInChunks(...)
readFileInChunks(options: ReadFileInChunksOptions, callback: ReadFileInChunksCallback) => Promise<CallbackID>
从磁盘分块读取文件。 仅原生(在Web上不可用)。 使用回调接收每个读取的块。 如果返回空块,则表示文件已完全读取。
参数 | 类型 |
---|---|
options |
|
callback |
|
返回: Promise<string>
Since: 7.1.0
writeFile(...)
writeFile(options: WriteFileOptions) => Promise<WriteFileResult>
将文件写入设备的指定位置
参数 | 类型 |
---|---|
options |
|
返回:
Promise<WriteFileResult>
Since: 1.0.0
appendFile(...)
appendFile(options: AppendFileOptions) => Promise<void>
在设备的指定位置追加文件内容
参数 | 类型 |
---|---|
options |
|
Since: 1.0.0
deleteFile(...)
deleteFile(options: DeleteFileOptions) => Promise<void>
从磁盘删除文件
参数 | 类型 |
---|---|
options |
|
Since: 1.0.0
mkdir(...)
mkdir(options: MkdirOptions) => Promise<void>
创建目录。
参数 | 类型 |
---|---|
options |
|
Since: 1.0.0
rmdir(...)
rmdir(options: RmdirOptions) => Promise<void>
删除目录
参数 | 类型 |
---|---|
options |
|
Since: 1.0.0
readdir(...)
readdir(options: ReaddirOptions) => Promise<ReaddirResult>
返回目录中的文件列表(非递归)
参数 | 类型 |
---|---|
options |
|
返回:
Promise<ReaddirResult>
Since: 1.0.0
getUri(...)
getUri(options: GetUriOptions) => Promise<GetUriResult>
返回路径和目录的完整文件URI
参数 | 类型 |
---|---|
options |
|
返回:
Promise<GetUriResult>
Since: 1.0.0
stat(...)
stat(options: StatOptions) => Promise<StatResult>
返回文件的数据信息
参数 | 类型 |
---|---|
options |
|
返回:
Promise<FileInfo>
Since: 1.0.0
rename(...)
rename(options: RenameOptions) => Promise<void>
重命名文件或目录
参数 | 类型 |
---|---|
options |
|
Since: 1.0.0
copy(...)
copy(options: CopyOptions) => Promise<CopyResult>
复制文件或目录
参数 | 类型 |
---|---|
options |
|
返回:
Promise<CopyResult>
Since: 1.0.0
downloadFile(...)
downloadFile(options: DownloadFileOptions) => Promise<DownloadFileResult>
向服务器执行HTTP请求并将文件下载到指定位置。
此方法自版本7.1.0起已弃用。 我们建议改用@capacitor/file-transfer插件,与此插件结合使用。
参数 | 类型 |
---|---|
options |
|
返回:
Promise<DownloadFileResult>
Since: 5.1.0
addListener('progress', ...)
addListener(eventName: 'progress', listenerFunc: ProgressListener) => Promise<PluginListenerHandle>
添加文件下载进度事件的监听器。
此方法自版本7.1.0起已弃用。 我们建议改用@capacitor/file-transfer插件,与此插件结合使用。
参数 | 类型 |
---|---|
eventName | 'progress' |
listenerFunc |
|
返回:
Promise<PluginListenerHandle>
Since: 5.1.0
removeAllListeners()
removeAllListeners() => Promise<void>
移除此插件的所有监听器。
此方法自版本7.1.0起已弃用。 我们建议改用@capacitor/file-transfer插件,与此插件结合使用。
Since: 5.2.0
Interfaces
PermissionStatus
属性 | 类型 |
---|---|
publicStorage |
|
ReadFileResult
属性 | 类型 | 描述 | Since |
---|---|---|---|
data | string | Blob | 文件中包含的数据表示形式 注意:Blob仅在Web上可用。在原生平台上,数据以字符串形式返回。 | 1.0.0 |
ReadFileOptions
属性 | 类型 | 描述 | Since |
---|---|---|---|
path | string | 要读取的文件路径 | 1.0.0 |
directory |
| 从中读取文件的Directory | 1.0.0 |
encoding |
| 读取文件的编码方式,如果未提供,数据将作为二进制读取并返回base64编码。传递Encoding.UTF8以字符串形式读取数据 | 1.0.0 |
ReadFileInChunksOptions
属性 | 类型 | 描述 | Since |
---|---|---|---|
chunkSize | number | 块大小(字节)。 | 7.1.0 |
WriteFileResult
属性 | 类型 | 描述 | Since |
---|---|---|---|
uri | string | 文件写入的uri | 1.0.0 |
WriteFileOptions
属性 | 类型 | 描述 | 默认值 | Since |
---|---|---|---|---|
path | string | 要写入的文件路径 | 1.0.0 | |
data | string | Blob | 要写入的数据 注意:Blob数据仅在Web上受支持。 | 1.0.0 | |
directory |
| 存储文件的Directory | 1.0.0 | |
encoding |
| 写入文件的编码方式。如果未提供,数据将作为base64编码写入。传递Encoding.UTF8以字符串形式写入数据 | 1.0.0 | |
recursive | boolean | 是否创建任何缺失的父目录。 | false | 1.0.0 |