1# 保存用户文件 2 3在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。Picker获取的URI只具有临时权限,获取持久化权限需要通过[FilePicker设置永久授权](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)方式获取。 4 5对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应Picker的save()接口并传入对应的saveOptions来实现。通过Picker访问相关文件,无需申请权限。 6 7当前所有Picker的save接口都是用户可感知的,具体行为是拉起FilePicker, 将文件保存在系统文件管理器管理的特定目录,与图库管理的资源隔离,无法在图库中看到。 8 9如果开发者需要保存图片、视频资源到图库,可使用用户无感的[安全控件进行保存](../media/medialibrary/photoAccessHelper-savebutton.md)。 10 11## 保存图片或视频类文件 12 13[PhotoViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#photoviewpicker)在后续版本不再演进,建议使用[Media Library Kit(媒体文件管理服务)中能力来保存媒体库资源](../media/medialibrary/photoAccessHelper-savebutton.md)。 14 15如果开发场景无法调用安全控件进行图片、视频保存,可使用相册管理模块[PhotoAccessHelper.showAssetsCreationDialog](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#showassetscreationdialog12)接口进行保存操作。 16 17## 保存文档类文件 18 191. 导入选择器模块和基础文件API模块。 20 21 ```ts 22 import { picker } from '@kit.CoreFileKit'; 23 import { fileIo as fs } from '@kit.CoreFileKit'; 24 import { BusinessError } from '@kit.BasicServicesKit'; 25 import { common } from '@kit.AbilityKit'; 26 ``` 27 282. 创建文档保存选项实例。 29 30 ```ts 31 // 创建文件管理器选项实例 32 const documentSaveOptions = new picker.DocumentSaveOptions(); 33 // 保存文件名(可选) 34 documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; 35 // 保存文件类型['后缀类型描述|后缀类型'],选择所有文件:'所有文件(*.*)|.*'(可选) ,如果选择项存在多个后缀,默认选择第一个。 36 documentSaveOptions.fileSuffixChoices = ['文档|.txt', '.pdf']; 37 ``` 38 393. 创建[文件选择器DocumentViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#constructor12)实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。 40 41 ```ts 42 let uris: Array<string> = []; 43 // 请确保 getContext(this) 返回结果为 UIAbilityContext 44 let context = getContext(this) as common.Context; 45 // 创建文件选择器实例。 46 const documentViewPicker = new picker.DocumentViewPicker(context); 47 //用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的URI。 48 documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => { 49 uris = documentSaveResult; 50 console.info('documentViewPicker.save to file succeed and uris are:' + uris); 51 }).catch((err: BusinessError) => { 52 console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`); 53 }) 54 ``` 55 56 > **注意**: 57 > 58 > 1、建议不在Picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI。 59 > 2、使用Picker的[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接口获取到URI的权限是临时读写权限,待退出应用后台后,获取的临时权限就会失效。 60 > 3、如果想要获取持久化权限(仅在2in1设备上生效),请参考[文件持久化授权访问](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)。 61 > 4、可以通过便捷方式,直接将文件保存到[Download](#download模式保存文件)目录下。 62 634. 待界面从FilePicker返回后,使用[基础文件API的fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到文件描述符(fd)。 64 65 ```ts 66 const uri = ''; 67 //这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。 68 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); 69 console.info('file fd: ' + file.fd); 70 ``` 71 725. 通过(fd)使用[基础文件API的fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭(fd)。 73 74 ```ts 75 let writeLen: number = fs.writeSync(file.fd, 'hello, world'); 76 console.info('write data to file succeed and size is:' + writeLen); 77 fs.closeSync(file); 78 ``` 79 80## 保存音频类文件 81 821. 导入选择器模块和基础文件API模块。 83 84 ```ts 85 import { picker } from '@kit.CoreFileKit'; 86 import { fileIo as fs } from '@kit.CoreFileKit'; 87 import { BusinessError } from '@kit.BasicServicesKit'; 88 import { common } from '@kit.AbilityKit'; 89 ``` 90 912. 创建音频保存选项实例。 92 93 ```ts 94 // 创建文件管理器选项实例 95 const audioSaveOptions = new picker.AudioSaveOptions(); 96 // 保存文件名(可选) 97 audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; 98 ``` 99 1003. 创建[音频选择器AudioViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#audioviewpicker)实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-5)接口拉起FilePicker界面进行文件保存。 101 102 ```ts 103 let uri: string = ''; 104 // 请确保 getContext(this) 返回结果为 UIAbilityContext 105 let context = getContext(this) as common.Context; 106 const audioViewPicker = new picker.AudioViewPicker(context); 107 //用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。 108 audioViewPicker.save(audioSaveOptions).then((audioSelectResult: Array<string>) => { 109 uri = audioSelectResult[0]; 110 console.info('audioViewPicker.save to file succeed and uri is:' + uri); 111 }).catch((err: BusinessError) => { 112 console.error(`Invoke audioViewPicker.save failed, code is ${err.code}, message is ${err.message}`); 113 }) 114 ``` 115 116 > **注意**: 117 > 1、建议不在Picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI。 118 > 2、使用Picker获取的[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-3)URI权限是临时读写权限,待退出应用后台后,获取的临时权限就会失效。 119 > 3、如果想要获取持久化权限(仅在2in1设备上生效),请参考[文件持久化授权访问](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)。 120 > 4、可以通过便捷方式,直接将文件保存到[Download](#download模式保存文件)目录下。 121 1224. 待界面从FilePicker返回后,可以使用[基础文件API的fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到文件描述符(fd)。 123 124 ```ts 125 //这里需要注意接口权限参数是fileIo.OpenMode.READ_WRITE。 126 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); 127 console.info('file fd: ' + file.fd); 128 ``` 129 1305. 通过(fd)使用[基础文件API的fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭(fd)。 131 132 ```ts 133 let writeLen = fs.writeSync(file.fd, 'hello, world'); 134 console.info('write data to file succeed and size is:' + writeLen); 135 fs.closeSync(file); 136 137 ``` 138 139## DOWNLOAD模式保存文件 140 141用户在使用save接口时,可以将pickerMode配置为DOWNLOAD模式,该模式下会在公共路径download目录下创建用户当前hap包名的文件夹,并通过save接口返回值回传相应的URI,后续用户可以直接将文件保存在该URI下。 142 1431. 导入选择器模块和文件管理模块。 144 145 ```ts 146 import { picker } from '@kit.CoreFileKit'; 147 import { fileIo as fs } from '@kit.CoreFileKit'; 148 import { BusinessError } from '@kit.BasicServicesKit'; 149 import { common } from '@kit.AbilityKit'; 150 ``` 151 1522. 创建文件保存选项实例。 153 154 ```ts 155 // 创建文件管理器选项实例 156 const documentSaveOptions = new picker.DocumentSaveOptions(); 157 // 配置保存的模式为DOWNLOAD,若配置了DOWNLOAD模式,此时配置的其他documentSaveOptions参数将不会生效。 158 documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD; 159 ``` 160 1613. 创建文件选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-1)接口拉起FilePicker模态窗界面进行文件保存。用户点击同意,即可在download目录下创建对应应用的专属目录,返回该目录的URI。 162 163 ```ts 164 let uri: string = ''; 165 // 请确保 getContext(this) 返回结果为 UIAbilityContext 166 let context = getContext(this) as common.Context; 167 const documentViewPicker = new picker.DocumentViewPicker(context); 168 const documentSaveOptions = new picker.DocumentSaveOptions(); 169 documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD; 170 documentViewPicker.save(documentSaveOptions ).then((documentSaveResult: Array<string>) => { 171 uri = documentSaveResult[0]; 172 console.info('documentViewPicker.save succeed and uri is:' + uri); 173 }).catch((err: BusinessError) => { 174 console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`); 175 }) 176 ``` 177