96SEO 2026-02-23 11:51 14
该模块为基础文件操作API提供基础文件操作能力包括文件基本管理、文件目录管理、文件信息统计、文件流式读写等常用功能。

ohos.file.fs选择器
选择器Picker模块封装了PhotoViewPicker、DocumentViewPicker、AudioViewPicker等API模块提供文件选择与保存能力。
ohos.file.picker相册管理模块
该模块提供相册管理模块能力包括创建相册以及访问、修改相册中的媒体数据信息等。
ohos.file.photoAccessHelperPhotoViewPicker
图库选择器对象用来支撑选择图片/视频和保存图片/视频等用户场景。
DocumentViewPicker
语言基础V2版状态管理ComponentV2/Local自定义组件自定义构建函数Builder内置组件SaveButton/Tabs/Scroll/Column/Text/TextArea/Button常量与资源分类的访问MVVM模式
entry/src/main/ets/common/utils/Logger.ets
kit.PerformanceAnalysisKitconst
entry/src/main/resources/base/element/string.json
entry/src/main/resources/base/element/color.json
entry/src/main/resources/base/element/float.json
entry/src/main/ets/pages/HomePage.ets
../views/ApplicationFileTabEntry
{Text($r(app.string.title)).width($r(app.float.default_312)).height($r(app.float.default_41)).textAlign(TextAlign.Start).fontSize($r(app.float.default_30)).fontFamily(HarmonyHeiTi-Bold).fontColor($r(app.color.text_color)).lineHeight($r(app.float.default_41)).fontWeight(700).margin({top:
$r(app.float.default_7),bottom:
$r(app.float.default_24),right:
$r(app.float.default_24)})}.width($r(app.float.default_360)).height($r(app.float.default_56))Tabs()
{ApplicationFileTab()}.tabBar(new
SubTabBarStyle($r(app.string.bar1)).indicator({
{Text(PublicFilesTab)}.height($r(app.float.default_680))}.height(100%).tabBar(new
SubTabBarStyle($r(app.string.bar2)).indicator({marginTop
$r(app.float.default_8)}).labelStyle({font
$r(app.float.default_16)}}))}.barWidth($r(app.float.default_200)).barHeight($r(app.float.default_56)).width(100%)}.backgroundColor($r(app.color.picture_background)).justifyContent(FlexAlign.Center).width(100%)}
entry/src/main/ets/views/ApplicationFileTab.ets
../common/utils/WriteFileComponentV2
{Text($r(app.string.textarea_default)).width($r(app.float.default_294)).height($r(app.float.default_22)).fontColor($r(app.color.text_color)).fontWeight(500).fontSize($r(app.float.default_16)).fontFamily(HarmonyHeiTi-Medium).lineHeight($r(app.float.default_22)).textAlign(TextAlign.Start).margin({top:
$r(app.float.default_13),bottom:
$r(app.float.default_13),right:
$r(app.float.default_8)})TextArea({
}).width($r(app.float.default_336)).height($r(app.float.default_139)).borderRadius($r(app.float.default_24)).backgroundColor($r(app.color.start_window_background)).enableKeyboardOnFocus(false).onChange((value:
value})Text($r(app.string.file_content)).width($r(app.float.default_294)).height($r(app.float.default_22)).fontSize($r(app.float.default_16)).lineHeight($r(app.float.default_22)).fontWeight(500).margin({top:
$r(app.float.default_13),bottom:
$r(app.float.default_13),right:
$r(app.float.default_8)})TextArea({
}).enableKeyboardOnFocus(false).width($r(app.float.default_336)).height($r(app.float.default_139)).backgroundColor($r(app.color.start_window_background)).borderRadius($r(app.float.default_24))Column()
{Button($r(app.string.button1)).width($r(app.float.default_312)).height($r(app.float.default_40))//
写入信息并清空输入内容点击“保存”后清空文本框。
.onClick(()
{writeFile(this.content)this.content
})Button($r(app.string.button2)).width($r(app.float.default_312)).height($r(app.float.default_40)).margin({top:
$r(app.float.default_12),bottom:
$r(app.float.default_100)}).onClick(()
readFile()})}.width(100%).margin({
entry/src/main/ets/common/utils/WriteFile.ets
fileIo.createStreamSync(filePath,
w)fileStream.writeSync(content)fileStream.close()
首先需要结合context得到想要操作的文件路径。
然后对该文件进行写入操作这里使用的是createStreamSync创建文件流的形式。
通过文件流的方式可以控制文件的读写方式覆盖写的方式可以使得每次写操作互不影响。
entry/src/main/ets/common/utils/ReadFile.ets
fileIo.createStreamSync(filePath,
读取文件流信息fileStream.readSync(buf)//
con.toString()fileStream.close()return
与写入类似也通过文件路径去创建文件流进行读取操作。
通过statSync获取文件的详细信息进而得到文件内容的大小然后利用文件流将文件内容读取到ArrayBuffer中再将ArrayBuffer转化为string返回即可完成文件的读取操作。
entry/src/main/ets/pages/HomePage.ets
entry/src/main/ets/views/PublicFilesTab.ets
../common/utils/PictureSavingComponentV2
SaveIconStyle.FULL_FILLED,text:
SaveDescription.SAVE_IMAGE,buttonType:
{Image($r(app.media.img)).borderRadius($r(app.float.default_24)).width($r(app.float.default_312)).height($r(app.float.default_147))//
创建安全控件按钮SaveButton(this.saveButtonOptions).onClick(async
SaveButtonOnClickResult.SUCCESS)
photoAccessHelper.getPhotoAccessHelper(context)//
phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE,
getContext(this).resourceManager.getMediaContentSync($r(app.media.img).id)//
buffer.buffer)Logger.info(写入成功,
{Logger.error(SaveButtonOnClickResult
}).width($r(app.float.default_336)).height($r(app.float.default_223)).borderRadius($r(app.float.default_24)).justifyContent(FlexAlign.SpaceAround).backgroundColor($r(app.color.start_window_background))Column()
{Text($r(app.string.select_photo)).width($r(app.float.default_302)).height($r(app.float.default_48)).lineHeight($r(app.float.default_22)).fontFamily(HarmonyHeiTi-Medium).fontSize($r(app.float.default_16)).fontWeight(500).textAlign(TextAlign.Start).fontColor($r(app.color.text_color))Column()
{Image($r(app.media.ic_folder_add2)).width($r(app.float.default_24)).height($r(app.float.default_24)).objectFit(ImageFit.Contain)}
{Image(this.picture).width(100%).height(100%).borderRadius($r(app.float.default_24))}}.width($r(app.float.default_312)).height($r(app.float.default_147)).borderRadius($r(app.float.default_16)).backgroundColor($r(app.color.picture_background)).onClick(async
value})}).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}.margin({
}).backgroundColor($r(app.color.start_window_background)).width($r(app.float.default_336)).height($r(app.float.default_213)).borderRadius($r(app.float.default_24))}.width(100%)}
首先需要在图库中创建媒体资源随后将图片读取转化为ArrayBuffer最后再将该内容写入在图库中创建的媒体资源中。
createAsset方法会返回在图库中新建的媒体资源的uri只不过此时还是没有内容的空文件然后需要将本地图片文件的内容读取出来并写入该空文件即可完成图片保存到图库的操作。
entry/src/main/ets/common/utils/PictureSaving.ets
photoAccessHelper.PhotoSelectOptions()PhotoSelectOptions.MIMEType
photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPEPhotoSelectOptions.maxSelectNumber
photoAccessHelper.PhotoViewPicker()await
photoPicker.select(PhotoSelectOptions).***n((PhotoSelectResult:
photoAccessHelper.PhotoSelectResult)
{Logger.info(PhotoViewPicker.select
JSON.stringify(PhotoSelectResult))uris
PhotoSelectResult.photoUris}).catch((err:
{Logger.error(PhotoViewPicker.select
BusinessErrorLogger.error(PhotoViewPicker
调用PhotoViewPicker的select方法来得到被选择图片的uri即可完成读取图库中图片的信息。
entry/src/main/ets/common/utils/SavingAndSelectUserFile.ets
picker.DocumentSaveOptions()DocumentSaveOptions.newFileNames
picker.DocumentViewPicker()documentPicker.save(DocumentSaveOptions).***n((DocumentSaveResult:
{Logger.info(DocumentViewPicker.save
JSON.stringify(DocumentSaveResult))uri
根据文件路径打开文件流。
fileIo.writeSync(file.fd,
{Logger.error(DocumentViewPicker.save
BusinessErrorLogger.error(DocumentViewPicker
picker.DocumentSelectOptions()let
picker.DocumentViewPicker()await
documentPicker.select(DocumentSelectOptions).***n((DocumentSelectResult:
{Logger.info(DocumentViewPicker.select
JSON.stringify(DocumentSelectResult))uri
ArrayBuffer(size)fileIo.readSync(file.fd,
con.toString()Logger.info(DocumentViewPicker.select
{Logger.error(DocumentViewPicker.select
BusinessErrorLogger.error(DocumentViewPicker.select
在DocumentViewPicker提供的save方法的帮助下可以向用户目录下创建一个文件并返回它的uri。
DocumentViewPicker提供的select方法可以选择想要访问的文件并返回其uri。
获取到uri后即可完成对文件的读取并将信息返回的操作。
Kit文件基础服务为开发者提供统一的文件访问和管理能力涵盖应用文件和用户文件帮助用户高效地查找、管理、备份各类文件满足多样化的文件操作需求。
Kit将文件划分为三类应用文件如安装包、资源、缓存等由应用拥有和管理用户文件如图片、视频、文档等由登录用户所有系统文件包括系统资源、设备文件等由系统统一管理开发者无需操作。
按文件存储位置分为本地文件系统本地设备或外置设备和分布式文件系统支持跨设备访问。
Kit支持对应用文件进行查看、创建、读写、删除、复制、移动、获取属性等操作支持将应用文件上传至服务器或从服务器下载资源支持查询应用及文件系统的空间使用情况支持通过URI或文件描述符方式实现跨应用文件分享支持配置应用数据的备份与恢复同时提供统一的用户文件访问接口便于用户文件的选择与保存还支持在多设备间进行文件访问和传输。
Kit采用沙箱隔离机制为每个应用提供专属的文件目录空间确保文件的隔离性与安全性。
通过分享机制开发者可安全、高效地实现应用间文件共享确保数据一致性与传输安全是构建HarmonyOS文件能力的基础组件之一。
应用文件的所有者为应用包括应用安装文件、应用资源文件、应用缓存文件等。
应用沙箱是一种以安全防护为目的的隔离机制避免数据受到恶意路径穿越访问。
在这种沙箱的保护机制下应用可见的”。
对于每个应用系统会在内部存储空间映射出一个专属的“应用沙箱”与一部分系统文件应用运行必需的少量系统文件所在的”中应用仅能看到自己的应用文件以及少量的系统文件应用运行必需的少量系统文件。
因此本应用的文件也不为其他应用可见从而保护了应用文件的安全。
应用可以在“应用文件对于应用是只读的而应用若需访问用户文件则需要通过特定API同时经过用户的相应授权才能进行。
应用需要对应用文件目录下的应用文件进行查看、创建、读写、删除、移动、复制、获取属性等访问操作下面介绍具体方法。
开发者通过基础文件操作接口ohos.file.fs实现应用文件访问能力主要功能如下表所示。
注意使用基础文件操作接口时耗时较长的操作例如read、write等建议使用异步接口避免应用崩溃。
创建一个大小为1024字节的ArrayBuffer对象用于存储从文件中读取的数据let
读取文件内容到ArrayBuffer对象中并返回实际读取的字节数let
将ArrayBuffer对象转换为Buffer对象并转换为字符串输出let
readLen}fs.writeSync(destFile.fd,
writeOptions)readOptions.offset
关闭文件fs.closeSync(srcFile)fs.closeSync(destFile)
使用读写接口时需注意可选项参数offset的设置。
对于已存在且读写过的文件文件偏移指针默认在上次读写操作的终止位置。
以下示例代码演示了如何使用流接口读取test.txt的文件内容并写入到destFile.txt文件中。
outputStream.write(writeBuf)readOptions.offset
关闭文件流inputStream.closeSync()outputStream.closeSync()
使用流接口时需注意流的及时关闭。
同时流的异步接口应严格遵循异步接口使用规范避免同步、异步接口混用。
流接口不支持并发读写。
fs.createReadStream(${filesDir}/read.txt)//
fs.createWriteStream(${filesDir}/write.txt)//
暂停模式拷贝文件。
在拷贝数据时将原始数据暂停然后将数据复制到另一个位置//
适用于对数据完整性和一致性要求较高的场景rs.on(readable,
fs.createReadStream(${filesDir}/read.txt)//
fs.createWriteStream(${filesDir}/write.txt)//
流动模式拷贝文件。
数据的读取和写入是同时进行的不需要暂停原始数据的访问//
哈希流是一种数据传输和存储技术可以将任意长度的数据转换为固定长度的哈希值来验证数据的完整性和一致性。
以下代码演示了如何使用文件哈希处理接口ohos.file.hash来处理文件哈希流。
fs.createReadStream(filePath)//
hash.createHash(sha256)rs.on(data,
Uint8Array(data?.split().map((x:
x.charCodeAt(0))).buffer)})rs.on(close,
sha256)console.info(hashResult:
用户文件是指登录到该终端设备的用户所拥有的文件包括用户私有的图片、视频、音频、文档等
用户文件uri是文件的唯一标识在对用户文件进行访问与修改等操作时往往都会使用到uri不建议开发者解析uri中的片段用于业务代码开发。
文档类uri由picker拉起文件管理器选择或保存返回以及通过fileAccess模块获取。
媒体文件uri由picker通过拉起图库选择图片或者视频返回通过photoAccessHelper模块获取图片或者视频文件的uri以及通过userFileManager模块获取图片、视频或者音频文件的uri。
用户需要分享文件、保存图片、视频等用户文件时开发者可以通过系统预置的文件选择器FilePicker实现该能力。
通过Picker访问相关文件将拉起对应的应用引导用户完成界面操作接口本身无需申请权限。
picker获取的uri只具有临时权限获取持久化权限需要通过FilePicker设置永久授权方式获取。
根据用户文件的常见类型选择器FilePicker分别提供以下选项
PhotoViewPicker适用于图片或视频类型文件的选择与保存。
DocumentViewPicker适用于文件类型文件的选择与保存。
DocumentViewPicker对接的选择资源来自于FilePicker,
负责文件类型的资源管理文件类型不区分后缀比如浏览器下载的图片、文档等都属于文件类型。
AudioViewPicker适用于音频类型文件的选择与保存。
AudioViewPicker目前对接的选择资源来自于FilePicker。
图库选择器对象用来支撑选择图片/视频等用户场景。
在使用前需要先创建PhotoViewPicker实例。
photoAccessHelper.PhotoViewPicker()
通过选择模式拉起photoPicker界面用户可以选择一个或多个图片/视频。
接口采用promise异步返回形式传入可选参数PhotoSelectOptions对象返回PhotoSelectResult对象。
示例如下
photoAccessHelper.PhotoSelectOptions()PhotoSelectOptions.MIMEType
photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;PhotoSelectOptions.maxSelectNumber
photoAccessHelper.PhotoViewPicker()photoPicker.select(PhotoSelectOptions).***n((PhotoSelectResult:
photoAccessHelper.PhotoSelectResult)
{console.info(PhotoViewPicker.select
JSON.stringify(PhotoSelectResult))}).catch((err:
{console.error(PhotoViewPicker.select
BusinessError;console.error(PhotoViewPicker
通过选择模式拉起photoPicker界面用户可以选择一个或多个图片/视频。
接口采用callback异步返回形式传入参数PhotoSelectOptions对象返回PhotoSelectResult对象。
示例如下
photoAccessHelper.PhotoSelectOptions()PhotoSelectOptions.MIMEType
photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPEPhotoSelectOptions.maxSelectNumber
photoAccessHelper.PhotoViewPicker();photoPicker.select(PhotoSelectOptions,
photoAccessHelper.PhotoSelectResult)
{console.error(PhotoViewPicker.select
${err.message})return}console.info(PhotoViewPicker.select
JSON.stringify(PhotoSelectResult));})}
BusinessError;console.error(PhotoViewPicker
AsyncCallbackPhotoSelectResult)
通过选择模式拉起photoPicker界面用户可以选择一个或多个图片/视频。
接口采用callback异步返回形式返回PhotoSelectResult对象。
示例如下
photoAccessHelper.PhotoViewPicker()photoPicker.select((err:
photoAccessHelper.PhotoSelectResult)
{console.error(PhotoViewPicker.select
${err.message})return}console.info(PhotoViewPicker.select
JSON.stringify(PhotoSelectResult))})}
BusinessErrorconsole.error(PhotoViewPicker
documentSelectOptions.maxSelectNumber
documentSelectOptions.defaultFilePathUri
file://docs/storage/Users/currentUser/test
则每一个后缀名之间用英文逗号进行分隔可选后缀类型名不能超过100,
documentSelectOptions.fileSuffixFilters
选择是否对指定文件或目录授权true为授权当为true时defaultFilePathUri为必选参数
拉起文管授权界面false为非授权默认为false拉起常规文管界面可选仅支持2in1设备。
创建文件选择器DocumentViewPicker实例。
调用select()接口拉起FilePicker应用界面进行文件选择。
picker.DocumentViewPicker(context);
documentViewPicker.select(documentSelectOptions).***n((documentSelectResult:
documentSelectResultconsole.info(documentViewPicker.select
待界面从FilePicker返回后使用基础文件API的fs.openSync接口通过uri打开这个文件得到文件描述符(fd)。
//这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
创建音频选择器AudioViewPicker实例。
调用select()接口拉起FilePicker应用界面进行文件选择。
picker.AudioViewPicker(context)
audioViewPicker.select(audioSelectOptions).***n((audioSelectResult:
audioSelectResult[0]console.info(audioViewPicker.select
待界面从FilePicker返回后可以使用基础文件API的fs.openSync接口通过uri打开这个文件得到文件描述符(fd)。
//这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
通过fd可以使用基础文件API的fs.readSync接口读取这个文件内的数据。
在从网络下载文件到本地或将已有用户文件另存为新的文件路径等场景下需要使用FilePicker提供的保存用户文件的能力。
当用户需要保存图片、视频等用户文件到图库时无需在应用中申请相册管理模块权限ohos.permission.WRITE_IMAGEVIDEO应用可以通过安全控件或授权弹窗的方式将用户指定的媒体资源保存到图库中。
设置安全控件按钮属性。
创建安全控件按钮。
调用MediaAssetChangeRequest.createImageAssetRequest和PhotoAccessHelper.applyChanges接口创建图片资源。
SaveIconStyle.FULL_FILLED,text:
SaveDescription.SAVE_IMAGE,buttonType:
{SaveButton(this.saveButtonOptions)
SaveButtonOnClickResult.SUCCESS)
photoAccessHelper.getPhotoAccessHelper(context)//
file://com.example.temptest/data/storage
/el2/base/haps/entry/files/test.jpg;let
photoAccessHelper.MediaAssetChangeRequest
photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context,
phAccessHelper.applyChanges(assetChangeRequest)console.info(createAsset
assetChangeRequest.getAsset().uri)}
{console.error(SaveButtonOnClickResult
除了上述通过fileUri从应用沙箱指定资源内容的方式开发者还可以通过ArrayBuffer的方式添加资源内容。
指定待保存到媒体库的位于应用沙箱的应用文件图片uri。
指定待保存照片的创建选项包括文件后缀和照片类型标题和照片子类型可选。
调用showAssetsCreationDialog基于弹窗授权的方式获取的目标媒体文件uri。
将来源于应用沙箱的照片内容写入媒体库的目标uri。
photoAccessHelper.getPhotoAccessHelper(context)async
file://com.example.temptest/data/storage/
el2/base/haps/entry/files/test.jpglet
指定待保存照片的创建选项包括文件后缀和照片类型标题和照片子类型可选let
ArrayphotoAccessHelper.PhotoCreationConfig
photoAccessHelper.PhotoType.IMAGE,subtype:
photoAccessHelper.PhotoSubtype.DEFAULT,
phAccessHelper.showAssetsCreationDialog(srcFileUris,
fileIo.OpenMode.READ_ONLY)await
desFile.fd)fileIo.closeSync(srcFile)fileIo.closeSync(desFile)console.info(create
documentSaveOptions.newFileNames
保存文件类型[后缀类型描述|后缀类型],选择所有文件所有文件(*.*)|.*可选
如果选择项存在多个后缀最大限制100个过滤后缀默认选择第一个。
documentSaveOptions.fileSuffixChoices
创建文件选择器DocumentViewPicker实例。
调用save()接口拉起FilePicker界面进行文件保存。
picker.DocumentViewPicker(context)
documentViewPicker.save(documentSaveOptions).***n((documentSaveResult:
documentSaveResultconsole.info(documentViewPicker.save
待界面从FilePicker返回后使用基础文件API的fs.openSync接口通过URI打开这个文件得到文件描述符(fd)。
//这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。
通过(fd)使用基础文件API的fs.writeSync接口对这个文件进行编辑修改编辑修改完成后关闭(fd)。
创建音频选择器AudioViewPicker实例。
调用save()接口拉起FilePicker界面进行文件保存。
picker.AudioViewPicker(context);
audioViewPicker.save(audioSaveOptions).***n((audioSelectResult:
audioSelectResult[0]console.info(audioViewPicker.save
待界面从FilePicker返回后可以使用基础文件API的fs.openSync接口通过URI打开这个文件得到文件描述符(fd)。
//这里需要注意接口权限参数是fileIo.OpenMode.READ_WRITE。
通过(fd)使用基础文件API的fs.writeSync接口对这个文件进行编辑修改编辑修改完成后关闭(fd)。
路径创建目录、跳过文件选择界面直接保存文件、并返回具备持久化权限的URI供用户创建文件的能力。
此时配置的其他documentSaveOptions参数将不会生效。
picker.DocumentPickerMode.DOWNLOAD
picker.DocumentViewPiker(context)
picker.DocumentPickerMode.DOWNLOAD;
documentViewPicker.save(documentSaveOptions
documentSaveResult[0];console.info(documentViewPicker.save
fs.OpenMode.READ_WRITE)fs.writeSync(file.fd,
HarmonyOS)fs.closeSync(file.fd);}).catch((err:
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback