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

鸿蒙:从图库选择图片并上传到服务器

前言:

我们安全访问相册是不需要任何权限的,上传则需要网络权限,这点需要注意。

我们还是老样子,看着官方文档进行学习,链接如下:

文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-image-22接下来,我就不多说了,直接上效果图和封装好的代码:

1、Index.ets

import { uploadImageUtil } from './UploadImageUtil'@Entry
@Component
struct Index {build() {Column() {Button('选择图片上传').width('100%').onClick(() => {uploadImageUtil.openPhotoPicker()})}.width('100%').height('100%').padding(16).justifyContent(FlexAlign.End)}
}

2、UploadImageUtil.ets

import { common } from '@kit.AbilityKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { request } from '@kit.BasicServicesKit';class UploadImageUtil {uiContext: UIContext = AppStorage.get('UIContext') as UIContextopenPhotoPicker() {// 获取应用文件路径let context = this.uiContext.getHostContext() as common.UIAbilityContext;let cacheDir = context.cacheDir;let photoPicker = new photoAccessHelper.PhotoViewPicker();photoPicker.select({MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,maxSelectNumber: 1}, (_, result) => {if (result) {result.photoUris.forEach((uri) => {let file = fs.openSync(uri, fs.OpenMode.CREATE);// 复制文件到缓存目录下fs.copyFileSync(file.fd, cacheDir + '/test.jpeg');this.uploadImage(['internal://cache/test.jpeg']);})}})}private uploadImage(paths: string[]) {let allFiles = Array<request.File>();let header = new Map<Object, string>();header.set('Content-Type', 'multipart/form-data');header.set('key2', 'value2');for (let i = 0; i < paths.length; i++) {allFiles[i] = {name: 'image' + i + '.jpeg',filename: 'image' + i + '.jpeg',uri: paths[i],type: 'image'}}let data: Array<request.RequestData> = [{ name: 'name', value: 'value' }];let url = 'http://XXX&#34';this.uiContext.showAlertDialog({ message: "上传图片请使用自己的接口地址" })let uploadConfig: request.UploadConfig = {// 将这个url替换成你的接口地址url: url,header: header,method: 'POST',files: allFiles,data: data}try {request.uploadFile(this.uiContext.getHostContext(), uploadConfig, (error, uploadTask) => {if (uploadTask) {uploadTask.on('progress', (uploadSize: number, totalSize: number) => {console.info('progress,uploadedSize:' + uploadSize + ',totalSize:' + totalSize);})} else {console.info('upload failure:' + error);}})} catch (error) {console.info('upload failure:' + error);}}
}export const uploadImageUtil = new UploadImageUtil();

3、EntryAbility.ets

  onWindowStageCreate(windowStage: window.WindowStage): void {// Main window is created, set main page for this abilityhilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');windowStage.loadContent('pages/Index', (err) => {
////···································添加下面的代码························let context = windowStage.getMainWindowSync().getUIContext()AppStorage.setOrCreate('UIContext', context)/////································}

4、补充:

网络权限在module.json5中添加

   "requestPermissions": [{"name": "ohos.permission.INTERNET"}
]

以上是个人经验分享

http://www.xdnf.cn/news/19860.html

相关文章:

  • 什么情况下会用到ConcurrentSkipListMap
  • 【系统架构设计(15)】软件架构设计一:软件架构概念与基于架构的软件开发
  • PDF Reader 编辑阅读工具(Mac中文)
  • Linux 常用命令全解析:从入门到实战的必备指南
  • TypeScript 增强功能大纲 (相对于 ECMAScript)
  • 如何轻松地将联系人从 Mac 同步到 iPhone
  • SQLmap 完整使用指南:环境搭建 + 命令详解 + 实操案例
  • SQL Server服务管理
  • 处理省市区excel数据加工成SQL
  • 常用的几种测试工具:selenium,jmeter,jenkins
  • 【IO】进程间通信(IPC)练习
  • Unity 的游戏循环机制
  • 66车载诊断架构 --- 从架构系统角度怎么确保整车DTC的完整性?
  • (二)文件管理-基础命令-pwd命令的使用
  • 计算机视觉(六):腐蚀操作
  • 电脑城老板不会告诉你的装机秘籍:建造者模式让你的代码高配起飞!
  • 基于深度学习的医疗器械生产备案凭证识别技术,实现从图像到结构化数据的智能转化
  • pytorch初级
  • 八、算法设计与分析
  • 新后端漏洞(上)- Python unpickle 造成任意命令执行漏洞
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1
  • RoPE位置编码缩放因子的最优解:频率维度与位置敏感度的精妙权衡
  • SpringBoot项目package报错 PKIX path building failed 终极解决方案:Nexus私服证书导入JDK证书库
  • C++对象构造与析构
  • 2.插值法
  • Spring Boot 实现数据库表变更监听的 Redis 消息队列方案
  • 技术方案之Mysql部署架构
  • uni app 的app 端调用tts 进行文字转语音
  • GDAL 下载安装
  • C题目训练【三连击】