当前位置: 首页 > news >正文

【HarmonyOS】API9网络buffer图片加载

 【引言】

HarmonyOS中加载网络图片常用的方法是直接给Image组件添加图片的网络地址,申请网络权限ohos.permission.INTERNET后就可以通过url加载对应的图片了,如HarmonyOS官网中的写法:

Image('https://www.example.com/example.JPG')

【问题概述】

但是日常开发中有些图片是存储云服务器中的,下载这些图片需要通过鉴权接口请求,获得的也不是图片的url地址而是二进制的图片buffer数据,类似于AGC中云存储的REST API接口:下载文件-REST API-Server-云存储 | 华为开发者联盟 (huawei.com),下面是官网Java示例代码:

public static void download(String storageUrl, DownloadObjectParam param) throws Exception {URIBuilder uriBuilder = new URIBuilder(storageUrl + param.getBucketName() + "/" + param.getObjectName());HttpGet get = new HttpGet(uriBuilder.build());get.setHeader("productId", param.getProjectId());get.setHeader("client_id", param.getClientId());get.setHeader("Authorization", "Bearer " + param.getToken());CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse httpResponse = httpClient.execute(get);int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {try (InputStream inputStream = httpResponse.getEntity().getContent();FileOutputStream outputStream = new FileOutputStream(getFileName(param.getObjectName()))) {// 将响应的实体流写入到本地文件,业务实际应用时,需要将FileOutputStream的入参改成业务指定的目录下byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, len);}outputStream.flush();}}httpResponse.close();
}

上述代码中我们获取图片数据首先需要进行授权验证,验证通过接口会获取文件数据,然后就可以使用流的操作形式将数据保存再本地文件中展示,那么在HarmonyOS中我们该如何操作呢

【具体实现】

一、通过httpRequest构建GET请求,添加鉴权的header头文件,创建request请求

二、将获取data中的result数据创建pixelMap,解码编码PixelMap完成图片buffer的加载。

三、Image组件使用pixel数据完成加载

具体代码如下:

  private async httpRequest() {let httpRequest = http.createHttp()let url="storageUrl";let option={method:http.RequestMethod.GET,header:{"Authorization":"Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","productId":"","client_id":""},}let _res= httpRequest.request(url ,option);  // 请填写一个具体的网络图片地址await _res.then((data) => {let code = data.responseCodeif(ResponseCode.ResponseCode.OK == code) {let imageSource = image.createImageSource(data.result)let options = {alphaType: 0,                    // 透明度editable: false,                 // 是否可编辑pixelFormat: 3,                  // 像素格式scaleMode: 1,                    // 缩略值size: {height: 100, width: 100}} // 创建图片大小imageSource.createPixelMap(options).then((pixelMap) => {this.image = pixelMap})} else {console.log("response code: " + code)}}).catch((err) => {console.log("error code: " + error.code + ", msg: " + error.message)});}}
http://www.lryc.cn/news/108153.html

相关文章:

  • 【前端实习生备战秋招】—HTML 和 CSS面试题总结(二)
  • 操作系统知识点总结
  • (C++) 多线程之生产者消费者问题
  • 【C语言学习】逃逸字符(转义字符)
  • 开发手册|Java后端开发规范重点条目整理
  • c++11 标准模板(STL)(std::basic_ofstream)(二)
  • k8s概念-pv和pvc
  • python算法指南程序员经典,python算法教程pdf百度云
  • 微服务使用步骤
  • Ubuntu 23.04 作为系统盘的体验和使用感受
  • 百分点科技跻身中国智慧应急人工智能解决方案市场前三
  • vscode如何退出/切换 github 账号
  • maven发布到中央仓库
  • C#IEnumberable<>
  • Flink非对齐checkpoint原理(Flink Unaligned Checkpoint)
  • Linux crontab命令:循环执行定时任务(详解)
  • Linux系统jenkins+newman+postman持续集成环境搭建
  • flutter:Future、Stream、RxDart
  • Jenkins安装、配置、自动化构建前(nodejs)后端(maven)项目
  • 【网络基础进阶之路】设计网络划分的实战详解
  • 艺术二维码 API 申请及使用
  • JVM GC ROOT分析
  • 记一道有趣的sql题
  • C高级【day2】
  • 认识Webpack插件Plugin;CleanWebpackPlugin插件;HtmlWebpackPlugin;DefinePlugin;Mode模式
  • Redis 6.0的新特性:多线程、客户端缓存与安全
  • 【雕爷学编程】MicroPython动手做(37)——驱动LCD与图文显示3
  • 自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:序列化提示信息]
  • 【LinearAlgebra】Chapter 12 - Linear Algebra in Probability Statistics
  • webshell详解