1# 保存用户文件 2 3在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。 4 5对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。通过Picker访问相关文件,无需申请权限。 6 7当前所有picker的save接口都是用户可感知的,具体行为是拉起FilePicker, 将文件保存在系统文件管理器管理的特定目录,与图库管理的资源隔离,无法在图库中看到。 8 9如需要在图库中看到所保存的图片、视频资源,请使用用户无感的[安全控件创建媒体资源](../media/medialibrary/photoAccessHelper-resource-guidelines.md#使用安全控件创建媒体资源)。 10 11 12## 保存图片或视频类文件 13 14本例展示了从图库中选择一张图片,保存到文件管理器的示例代码。 15 161. 导入[选择器](../reference/apis-core-file-kit/js-apis-file-picker.md)、[文件管理](../reference/apis-core-file-kit/js-apis-file-fs.md)、[相册管理](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md)模块。 17 18 ```ts 19 import picker from '@ohos.file.picker'; 20 import fs from '@ohos.file.fs'; 21 import photoAccessHelper from '@ohos.file.photoAccessHelper'; 22 ``` 23 242. 调用[select()](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#select)接口从设备中选择一张图片,并用一个全局变量存储返回的uri。 25 26 ```ts 27 import photoAccessHelper from '@ohos.file.photoAccessHelper'; 28 import { BusinessError } from '@ohos.base'; 29 30 let selectUris: Array<string> = []; 31 try { 32 let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions(); 33 PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; 34 PhotoSelectOptions.maxSelectNumber = 1; 35 let photoPicker = new photoAccessHelper.PhotoViewPicker(); 36 photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => { 37 selectUris = PhotoSelectResult.photoUris; 38 console.info('PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult)); 39 }).catch((err: BusinessError) => { 40 console.error(`PhotoViewPicker.select failed with err: ${err.code}, ${err.message}`); 41 }); 42 } catch (error) { 43 let err: BusinessError = error as BusinessError; 44 console.error(`PhotoViewPicker failed with err: ${err.code}, ${err.message}`); 45 } 46 ``` 47 483. 调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,并用一个全局变量存储返回的uri。 49 50 save返回的uri权限是读写权限,可以根据结果集里面的uri进行文件读写等操作。 51 52 ```ts 53 import picker from '@ohos.file.picker'; 54 import { BusinessError } from '@ohos.base'; 55 56 let saveUris: Array<string> = []; 57 try { 58 const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例 59 photoSaveOptions.newFileNames = ["PhotoViewPicker01.png"]; // 保存文件名(可选),方括号里的文件名自定义,每次不能重复,设备里已有这个文件的话,名字就需要改个不一样的,不然接口会报错 60 const photoViewPicker = new picker.PhotoViewPicker(); 61 try { 62 let photoSaveResult = await photoViewPicker.save(photoSaveOptions); 63 if (photoSaveResult != undefined) { 64 saveUris = photoSaveResult; 65 console.info('photoViewPicker.save to file succeed and uris are:' + photoSaveResult); 66 } 67 } catch (error) { 68 let err: BusinessError = error as BusinessError; 69 console.error(`[picker] Invoke photoViewPicker.save failed, code is ${err.code}, message is ${err.message}`); 70 } 71 } catch (error) { 72 let err: BusinessError = error as BusinessError; 73 console.info("[picker] photoViewPickerSave error = " + JSON.stringify(err)); 74 } 75 ``` 76 774. 使用[fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过选择和保存uri打开这两个文件得到fd,这里需要注意接口权限参数分别是fs.OpenMode.READ_ONLY和fs.OpenMode.WRITE_ONLY。再调用[fs.copyFileSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fscopyfilesync)接口进行复制,修改完成后关闭两个文件。 78 79 ```ts 80 import fs from '@ohos.file.fs'; 81 import { BusinessError } from '@ohos.base'; 82 83 try { 84 let photoSelect = fs.openSync(selectUris[0], fs.OpenMode.READ_ONLY); 85 let photoSave = fs.openSync(saveUris[0], fs.OpenMode.WRITE_ONLY); 86 fs.copyFileSync(photoSelect.fd, photoSave.fd); 87 fs.close(photoSelect); 88 fs.close(photoSave); 89 } catch (error) { 90 let err: BusinessError = error as BusinessError; 91 console.info("[picker] Photo Save error = " + JSON.stringify(err)); 92 } 93 ``` 94 95## 保存文档类文件 96 971. 导入选择器模块和文件管理模块。 98 99 ```ts 100 import picker from '@ohos.file.picker'; 101 import fs from '@ohos.file.fs'; 102 import { BusinessError } from '@ohos.base'; 103 ``` 104 1052. 创建文档保存选项实例。 106 107 ```ts 108 const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例 109 documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; // 保存文件名(可选) 110 documentSaveOptions.fileSuffixChoices = ['.png', '.txt', '.mp4']; // 保存文件类型(可选) 111 ``` 112 1133. 创建文档选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-3)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。 114 115 </br>save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。 116 117 ```ts 118 import { BusinessError } from '@ohos.base'; 119 120 let uris: Array<string> = []; 121 const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例 122 documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => { 123 uris = documentSaveResult; 124 console.info('documentViewPicker.save to file succeed and uris are:' + uris); 125 }).catch((err: BusinessError) => { 126 console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`); 127 }) 128 ``` 129 1304. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。 131 132 ```ts 133 import fs from '@ohos.file.fs'; 134 135 const uri = ''; 136 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); 137 console.info('file fd: ' + file.fd); 138 ``` 139 1405. 通过fd使用[fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。 141 142 ```ts 143 import fs from '@ohos.file.fs'; 144 145 let writeLen: number = fs.writeSync(file.fd, 'hello, world'); 146 console.info('write data to file succeed and size is:' + writeLen); 147 fs.closeSync(file); 148 ``` 149 150## 保存音频类文件 151 1521. 导入选择器模块和文件管理模块。 153 154 ```ts 155 import picker from '@ohos.file.picker'; 156 import fs from '@ohos.file.fs'; 157 import { BusinessError } from '@ohos.base'; 158 ``` 159 1602. 创建音频保存选项实例。 161 162 ```ts 163 const audioSaveOptions = new picker.AudioSaveOptions(); // 创建文件管理器选项实例 164 audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; // 保存文件名(可选) 165 ``` 166 1673. 创建音频选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-6)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。 168 169 </br>save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。 170 171 ```ts 172 let uri: string = ''; 173 const audioViewPicker = new picker.AudioViewPicker(); 174 audioViewPicker.save(audioSaveOptions).then((audioSelectResult: Array<string>) => { 175 uri = audioSelectResult[0]; 176 console.info('audioViewPicker.save to file succeed and uri is:' + uri); 177 }).catch((err: BusinessError) => { 178 console.error(`Invoke audioViewPicker.save failed, code is ${err.code}, message is ${err.message}`); 179 }) 180 ``` 181 1824. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。 183 184 ```ts 185 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); 186 console.info('file fd: ' + file.fd); 187 ``` 188 1895. 通过fd使用[fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。 190 191 ```ts 192 let writeLen = fs.writeSync(file.fd, 'hello, world'); 193 console.info('write data to file succeed and size is:' + writeLen); 194 fs.closeSync(file); 195 ``` 196 197 198