diff --git a/zh-cn/application-dev/file-management/save-user-file.md b/zh-cn/application-dev/file-management/save-user-file.md index 6cbb287dc91c47a7b21834fc5946ed646da1f015..86f26852da365d4a60a1833394577fc326f909b1 100644 --- a/zh-cn/application-dev/file-management/save-user-file.md +++ b/zh-cn/application-dev/file-management/save-user-file.md @@ -2,55 +2,100 @@ 在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。 -对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。 +对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。此类接口不需要申请任何权限。 save接口会将文件保存在文件管理器,而不是图库。 ## 保存图片或视频类文件 -1. 导入选择器模块和文件管理模块。 +本例展示了从图库中选择一张图片,保存到文件管理器的示例代码。 + +1. 导入[选择器](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-file-picker.md)、[文件管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-file-fs.md)、[相册管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-photoAccessHelper.md)、[数据共享谓词](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-data-dataSharePredicates.md)模块。 ```ts import picker from '@ohos.file.picker'; import fs from '@ohos.file.fs'; + import photoAccessHelper from '@ohos.file.photoAccessHelper'; + import dataSharePredicates from '@ohos.data.dataSharePredicates'; ``` -2. 创建图库保存选项实例。 +2. 获取设备里第一张图片的缩略图。注意:在执行这一步之前,要先确保设备里至少有一张图片。 ```ts - const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例 - photoSaveOptions.newFileNames = ["PhotoViewPicker01.jpg"]; // 保存文件名(可选) + const context = getContext(this); + let photoAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); + + let pixelmapArrayBuffer; + async getPixelmap() { + try { + let predicates = new dataSharePredicates.DataSharePredicates(); + let fetchOption = { + fetchColumns: [], + predicates: predicates + }; + let fetchResult = await photoAccessHelper.getAssets(fetchOption); + console.info('[picker] getThumbnail fetchResult: ' + fetchResult); + const asset = await fetchResult.getFirstObject(); + console.info('[picker] getThumbnail asset displayName = ', asset.displayName); + asset.getThumbnail().then((pixelMap) => { + let pixelBytesNumber = pixelMap.getPixelBytesNumber(); + const readBuffer = new ArrayBuffer(pixelBytesNumber); + pixelMap.readPixelsToBuffer(readBuffer).then(() => { + pixelmapArrayBuffer = readBuffer; + }) + }).catch((err) => { + console.error('[picker] getThumbnail failed with error: ' + err); + }); + } catch (error) { + console.error('[picker] getThumbnail error = ' + error); + } + } ``` -3. 创建图库选择器实例,调用[save()](../reference/apis/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。 +3. 创建图库选择器实例,调用[save()](../reference/apis/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存图片的uri。 -
save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。 - - ```ts - let uri = null; - const photoViewPicker = new picker.PhotoViewPicker(); - photoViewPicker.save(photoSaveOptions).then((photoSaveResult) => { - uri = photoSaveResult[0]; - console.info('photoViewPicker.save to file succeed and uri is:' + uri); - }).catch((err) => { - console.error(`Invoke photoViewPicker.save failed, code is ${err.code}, message is ${err.message}`); - }) + save返回的uri权限是读写权限,可以根据结果集里面的uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。 + + ```ts + let uri:string; + async photoViewPickerSave() { + try { + const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例 + photoSaveOptions.newFileNames = ["PhotoViewPicker01.png"]; // 保存文件名(可选),方括号里的文件名自定义,每次不能重复,设备里已有这个文件的话,名字就需要改个不一样的,不然接口会报错 + + const photoViewPicker = new picker.PhotoViewPicker(); + try { + let photoSaveResult = await photoViewPicker.save(photoSaveOptions); + if (photoSaveResult != undefined) { + console.info("[picker] photoViewPickerSave photoSaveResult = " + JSON.stringify(photoSaveResult)); + this.uri = photoSaveResult[0]; + console.info('photoViewPicker.save to file succeed and uri is:' + photoSaveResult[0]); + } + } catch (err) { + console.error(`[picker] Invoke photoViewPicker.save failed, code is ${err.code}, message is ${err.message}`); + } + } catch (error) { + console.info("[picker] photoViewPickerSave error = " + error); + } + } ``` 4. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。 - ```ts - let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); - console.info('file fd: ' + file.fd); - ``` - -5. 通过fd使用[fs.writeSync](../reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。 + 然后,通过fd使用[fs.write](../reference/apis/js-apis-file-fs.md#fswrite)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。 ```ts - let writeLen = fs.writeSync(file.fd, 'hello, world'); - console.info('write data to file succeed and size is:' + writeLen); - fs.closeSync(file); + async writeOnly(uri) { + try { + let file = fs.openSync(uri, fs.OpenMode.WRITE_ONLY); + let writeLen = await fs.write(file.fd, pixelmapArrayBuffer); + fs.closeSync(file); + console.info("[picker] writeOnly writeLen = " + writeLen); + } catch (error) { + console.info("[picker] writeOnly error: " + error); + } + } ``` ## 保存文档类文件 diff --git a/zh-cn/application-dev/file-management/select-user-file.md b/zh-cn/application-dev/file-management/select-user-file.md index 9aab768871b70c09f369598cb0be5d35134b9a45..23808273097dc2098543de0b8c149dec6ff7673a 100644 --- a/zh-cn/application-dev/file-management/select-user-file.md +++ b/zh-cn/application-dev/file-management/select-user-file.md @@ -1,6 +1,6 @@ # 选择用户文件 -终端用户有时需要分享、保存一些图片、视频等用户文件,开发者需要在应用中支持此类使用场景。此时,开发者可以使用OpenHarmony系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现用户文件选择及保存能力。 +终端用户有时需要分享、保存一些图片、视频等用户文件,开发者需要在应用中支持此类使用场景。此时,开发者可以使用OpenHarmony系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现用户文件选择及保存能力。此类接口不需要申请任何权限。 根据用户文件的常见类型,文件选择器(FilePicker)分别提供以下接口: