openharmony上传图片,并获取返回路径

news2024/11/15 12:42:16

适用条件:

openharmony开发

4.0 release版本,对应能力API10

一直不断尝试,一会用官方提供的上传文件,一会用第三方库的axios都不行,

一会报错‘没权限,一会报错’路径错误,还有报错‘401参数错误的,反正各种报错都遇到了,官方文档说的不够仔细,示例也不够清楚,痛苦

首先一定要动态获取权限,很重要 (即使在modules.json5文件里面已经说明了,在页面上还是要判断一下有咩有,然后申请权限)

写在onPageShow里,我没有加是否存在权限的判断,需要自行判断,有权限就不弹了,没权限在向用户申请,弹弹窗

import abilityAccessCtrl, { Context, PermissionRequestResult } from '@ohos.abilityAccessCtrl';
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext(this) as common.UIAbilityContext;
await atManager.requestPermissionsFromUser(context, [
  "ohos.permission.WRITE_MEDIA",
  "ohos.permission.READ_MEDIA",
], (err: BusinessError, data: PermissionRequestResult) => {
  if (err) {
    console.log(`requestPermissionsFromUser fail, err->${JSON.stringify(err)}`);
  } else {
    console.info('这是data:' + JSON.stringify(data));
    console.info('data permissions:' + data.permissions);
    console.info('data authResults:' + data.authResults); //如果是0则是有权限了
  }
})

看到这个弹窗,才算权限申请生效了

其次,一定要进行文件的复制,这样才能获取到文件(在下面代码)

方法一,使用官方提供的上传文件请求

import fs from '@ohos.file.fs';
import request from '@ohos.request';


 //fileUri是文件选择器返回的路径,格式如下: "datashare:///media/image/45"

  async uploadImg(fileUri: string) {

    / 获取应用文件路径
    const context = getContext(this) as common.UIAbilityContext;
    let cacheDir = context.cacheDir;  
    console.log('cacheDir', cacheDir); 
    //=>沙箱路径 /应用文件目录 /data/storage/el2/base/haps/entry/cache
   
    //文件名称,下面这两种方法都可以,原则就是保持名字随机性
     // let segments = fileUri.split('/')
    // let fileName = segments[segments.length-1]
    const fileName = Date.now() + '.jpg'
    //复制这一步一定不能少 ,简而言之,就是把我们的内部文件拿到外部暴露出来,
    let realUri = context.cacheDir + "/" + fileName //计划复制到的目标路径
    try {
      let file =  fs.openSync(fileUri);
      fs.copyFileSync(file.fd, realUri)
    } catch (err) {
      console.info('err:' + JSON.stringify(err));
    }


// // 鸿蒙自带请求
    let uploadTask: request.UploadTask;
    let uploadConfig: request.UploadConfig = {
      url: 'http://upload', //需要手动替换为真实服务器地址
      header: { 'Content-Type': 'multipart/form-data', token: AppStorage.get('token') },
      method: "POST",
      files: [{ filename: fileName, name: "image", uri: `internal://cache/${fileName}`, type: "jpg" }],
//注意这里,files里面的url一定是'internal://cache/'和文件名的拼接,不要拼其他路径!!!
      data: [],
    };
    //一定要定义类型,这里的类型定义真的很让人头大
    interface path{
      filePath:string
    }
    interface  bodyType{      
       code:string
      success:string
      data:path
    }
    interface resType{
      body:bodyType
    }
    try {
      request.uploadFile(context, uploadConfig).then((data: request.UploadTask) => {
        uploadTask.on('headerReceive', (header:object) => {
          const picRes:resType = header as resType
          console.log('上传头picRes', picRes.body )
        })
        uploadTask.on("complete", () => {
          promptAction.showToast({ message: '上传成功!', duration: 2000 })
          // 上传成功调接口
        })
      }).catch((err: BusinessError) => {
        console.error(`Failed to request the upload. Code: ${err.code}, message: ${err.message}`);
      });
    } catch (err) {
      console.error(`Failed to request the upload. err: ${JSON.stringify(err)}`);
    }

  }

方法二,使用第三方库 @ohos/axios,创建formdata对象请求

import fs from '@ohos.file.fs';
import axios, { AxiosError, AxiosProgressEvent, AxiosResponse, FormData, InternalAxiosRequestConfig } from '@ohos/axios'



 //fileUri是文件选择器返回的路径,格式如下: "datashare:///media/image/45"

  async uploadImg(fileUri: string) {

    / 获取应用文件路径
    const context = getContext(this) as common.UIAbilityContext;
    let cacheDir = context.cacheDir;  
    console.log('cacheDir', cacheDir); 
    //=>沙箱路径 /应用文件目录 /data/storage/el2/base/haps/entry/cache
   
    //文件名称,下面这两种方法都可以,原则就是保持名字随机性
     // let segments = fileUri.split('/')
    // let fileName = segments[segments.length-1]
    const fileName = Date.now() + '.jpg'
    //复制这一步一定不能少 ,简而言之,就是把我们的内部文件拿到外部暴露出来,
    let realUri = context.cacheDir + "/" + fileName //计划复制到的目标路径
    try {
      let file =  fs.openSync(fileUri);
      fs.copyFileSync(file.fd, realUri)
    } catch (err) {
      console.info('err:' + JSON.stringify(err));
    }

// 第三方库axios请求
    let formData = new FormData();
    formData.append('image', `internal://cache/${fileName}`);
    // formData.append('image',  'internal://cache/'+fileName);
    //记得替换真实请求地址
    axios.post<string, AxiosResponse<string>, FormData>('http://upload', formData, {
      headers: {
        'Content-Type': 'multipart/form-data',
        'token': AppStorage.get('token')
      },
      context: getContext(this),
      onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
        console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
      },
    }).then((res: AxiosResponse) => {
      interface  pathType{
        filePath:string
      }
      interface dataType{
        data:pathType
      }
      const data: dataType = res.data as dataType
      const path = data.data.filePath
      console.info("request result" ,path);
    }).catch((error: AxiosError) => {
      console.error("error:" + JSON.stringify(error));
    })

  }

别夸我,我真是个菩萨,经历了九九八十一难,搞了两天才弄好的上传方法

如果描述哪里不正确,不完整,及时告知我噢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Java网络编程精髓:UDP与TCP的实战魔法!

Java 中提供了专门的网络编程程序包 java.net&#xff0c;提供了两种通信协议&#xff1a;UDP&#xff08;数据报协议&#xff09;和 TCP&#xff08;传输控制协议&#xff09;&#xff0c;本文对两种通信协议的开发进行详细介绍。 1 UDP 介绍 UDP&#xff1a;User Datagram Pr…

压缩pdf文件的大小,pdf档怎么压缩为最小内存

在现代工作和学习中&#xff0c;pdf文件已经成为了一种不可或缺的文件格式。它跨平台、保持格式不变的优势使其在文件传输和分享中占据了重要位置。然而&#xff0c;pdf文件往往因为包含大量图像和文本而体积较大&#xff0c;这给文件的传输和存储带来了不少困扰。本文将为你介…

不会编程怎么办?量化交易不会编程可以使用吗?

量化交易使用计算机模型程序代替人工进行交易&#xff0c;一般需要投资者自己编写程序建模&#xff0c;然后回测无误之后再进行实盘交易&#xff0c;那么不会编程的投资者能使用量化软件进行量化交易吗&#xff1f; 不会编程使用量化软件有两种方法 一种是请人代写代码&#x…

Java高频面试基础知识点整理8

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题&#xff1a;《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源&#xff1a;Glasgow大学&#xff1b;爱丁堡大学 连接&#xff1a;https://arxiv.org/abs/2406.13099 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何…

Guava LocalCache源码分析:LocalCache生成

Guava LocalCache源码分析&#xff1a;Cache生成 版本LocalCache参数说明Cache构建过程LocalCache介绍LocalCache实例化将builder中的属性赋值到LocalCache中分段 LocalCache为guava本地缓存的解决方案&#xff0c;提供了基于容量&#xff0c;时间和引用的缓存回收方式&#xf…

Spring MVC入门3

看完这篇博客你能学到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的区别 如果想真正掌握&#xff0c;还需要自己勤加练习。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

免费长效IP在业务场景中的深度应用解析

在数字化竞赛的跑道上&#xff0c;每一秒的都至关重要&#xff0c;而免费长效IP&#xff0c;不仅为企业减少了运营成本&#xff0c;更在数据安全与访问效率上筑起了一道坚实的保护线。然而&#xff0c;面对市场上琳琅满目的代理服务&#xff0c;如何挑选出能应对各种业务场景的…

【JAVA poi-tl-ext 富文本转word】

富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…

ES 慢上游响应问题优化在用户体验场景中的实践

在抖音亿级日活流量的情况下&#xff0c;每天收到的用户反馈也是大量的&#xff0c;而用户反馈对于产品的发展与未来是至关重要的&#xff0c;因此用户体验管理平台&#xff08;简称VoC&#xff09;就应运而生&#xff0c;VoC 平台旨在通过技术平台化的方式&#xff0c;结合反馈…

字体反爬之自动化通过字体文件生成映射字典

1、首先找到以.ttf结尾的字体文件&#xff0c;下载下来&#xff0c;以我的字体文件sfont.ttf为例 sont.ttf下载地址https://download.csdn.net/download/lingyingdon/89534953 目前只测试了.ttf文件。如果想使用woff字体文件&#xff0c;请自行测试 2、下载分割字体文件的软件…

从汇编层看64位程序运行——参数传递的底层实现

大纲 小于等于6个参数一个参数总结 两个参数总结 三个参数总结 四个参数总结 五个参数总结 六个参数总结 大于6个参数七个参数总结 在32位系统中&#xff0c;参数的传递主要依靠栈来进行。那么64位系统上&#xff0c;是否依旧符合这个规则呢&#xff1f;答案是“不是”。64位系…

Objective-C 自定义渐变色Slider

文章目录 一、前情概要二、具体实现 一、前情概要 系统提供UISlider&#xff0c;但在开发过程中经常需要自定义&#xff0c;本次需求内容是实现一个拥有渐变色的滑动条&#xff0c;且渐变色随着手指touch的位置不同改变区域&#xff0c;类似如下 可以使用CAGradientLayer实现渐…

【Linux】Linux操作系统

Linux基本指令 os概念与定位 本节内容&#xff1a; Linux操作系统讲解 os概念与定位 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是管理和控制计算机硬件与软件资源的计算机程序。总的来讲&#xff0c;操作系统是一款做软硬件管理的软件。 了解操作…

springBoot(若依)集成camunda

1、下图为项目结构 2、最外层 pom引入依赖 <properties><!--camunda 标明版本&#xff0c;注意要个自己的Spring 版本匹配&#xff0c;匹配关系自行查询官网--><camunda.version>7.18.0</camunda.version> </properties> 3、common模块引入依赖 …

安卓14中Zygote初始化流程及源码分析

文章目录 日志抓取结合日志与源码分析systemServer zygote创建时序图一般应用 zygote 创建时序图向 zygote socket 发送数据时序图 本文首发地址 https://h89.cn/archives/298.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 本文主要结合日志和代码看安卓 14 中 Zy…

抗量子密码算法:保障未来信息安全的新盾牌

随着量子计算的迅猛发展&#xff0c;传统加密算法正面临着前所未有的挑战。量子计算机利用量子比特的特殊性质&#xff0c;能在极短时间内破解目前广泛使用的公钥加密体系&#xff0c;如RSA、ECC等。这使得我国及全球的信息安全体系遭受严重威胁。为了应对这一挑战&#xff0c;…

知识图谱入门笔记

自学参考&#xff1a; 视频&#xff1a;斯坦福CS520 | 知识图谱 最全知识图谱综述 详解知识图谱的构建全流程 知识图谱构建&#xff08;概念&#xff0c;工具&#xff0c;实例调研&#xff09; 一、基本概念 知识图谱&#xff08;Knowledge graph&#xff09;&#xff1a;由结…

基于LSTM的局部特征提取网络算法原理

目录 一、LSTM的基本原理与结构 1. LSTM的核心结构 2. LSTM的工作原理 二、基于LSTM的局部特征提取 1. 输入处理与序列表示 2. LSTM层处理与特征提取 3. 特征提取的优势与应用 三、实现细节与注意事项 1. 数据预处理 2. 网络结构与参数选择 3. 训练策略与正则化 4.…

Chapter 1:数据结构前言

在数字化的世界里&#xff0c;我们每天都在与数据打交道。然而&#xff0c;你是否曾想过&#xff0c;这些数据是如何被组织、存储和处理的&#xff1f;这就是数据结构的魅力所在。 数据结构&#xff0c;简单来说&#xff0c;就是数据的组织方式。它决定了我们如何高效地访问和操…