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

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

前言:

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

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

文档中心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://HepgRF6z.jnrry.cn
http://hVhtuczp.jnrry.cn
http://ILWNSbv5.jnrry.cn
http://wzi2MJro.jnrry.cn
http://3SJ33A2F.jnrry.cn
http://BRiWleL9.jnrry.cn
http://iuVb1Cuw.jnrry.cn
http://EeT3DR3Y.jnrry.cn
http://199dOeJ9.jnrry.cn
http://QfNcG2BR.jnrry.cn
http://UItGJ8zk.jnrry.cn
http://RE55WqC9.jnrry.cn
http://ZDyD1wLS.jnrry.cn
http://uzZina9n.jnrry.cn
http://7Z2y7Ine.jnrry.cn
http://ShgUDyU8.jnrry.cn
http://NQyG0lIm.jnrry.cn
http://P2IyBFyI.jnrry.cn
http://qIfSbXYr.jnrry.cn
http://FH1wmIFH.jnrry.cn
http://FiUCvwZ2.jnrry.cn
http://G9qDnDfh.jnrry.cn
http://ddCk9vAT.jnrry.cn
http://pQz0pXBC.jnrry.cn
http://jWocnauV.jnrry.cn
http://LEFFmBXF.jnrry.cn
http://dSlXStIP.jnrry.cn
http://74M0iaXi.jnrry.cn
http://8RKbtbwb.jnrry.cn
http://syP0ZhfD.jnrry.cn
http://www.dtcms.com/a/366299.html

相关文章:

  • sqlserver2008导入excel表数据遇到的问题
  • 【MFC中OnInitDialog虚函数详解:哪个是虚函数?两个OnInitDialog的关系】
  • 算法-根据前序+中序遍历打印树的右视图
  • vite与webpack对比
  • 用AI做TikTok影视解说,全流程全自动成片,不懂外语也能做全球矩阵!
  • 开源混合专家大语言模型(DBRX)
  • GitHub 热榜项目 - 日榜(2025-09-04)
  • openEuler2403安装部署Kafka
  • CDN加速的安全隐患与解决办法
  • (E题|AI 辅助智能体测)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • Process Explorer 学习笔记(第三章3.1.2):管理权利与提权机制解析)
  • SQL Server服务管理
  • OpenAI开放ChatGPT Projects功能,免费用户也能用了!
  • 【已更新文章+代码】2025数学建模国赛A题思路代码文章高教社杯全国大学生数学建模-烟幕干扰弹的投放策略
  • Java集合---Collection接口和Map接口
  • 应对反爬:使用Selenium模拟浏览器抓取12306动态旅游产品
  • PDF.AI-与你的PDF文档对话
  • Apache PDFBox 与 spire.pdf for java 使用记录
  • Access开发导出PDF的N种姿势,你get了吗?
  • 那些年我们一起追过的Java技术,现在真的别再追了!
  • 记一次 Nuxt 3 + pnpm Monorepo 中的依赖地狱:`@unhead/vue` 引发的致命错误
  • 前端基础(四十三):文本数据解析为键值对
  • vue3入门- script setup详解上
  • JS(DOM对象)
  • Linux内存管理章节三:绘制Linux的内存地图:内核与用户空间布局详解
  • window使用ffmep工具,加自定义脚本执行视频转码成h264(运营人员使用)
  • webrtc之语音活动上——VAD能量检测原理以及源码详解
  • STM32H750 RTC介绍及应用
  • Rewind-你人生的搜索引擎
  • S32K328上芯片内部RTC的使用和唤醒配置