Harmonyos Next——图片上传与下载

news/2024/10/22 14:39:14/

Harmonyos Next——图片上传与下载

  • 图片上传至服务器
    • 描述
    • 选取图片
      • 从相册选择图片
      • 通过拍摄获取图片
    • 将获取的图片上传至服务器
      • 拷贝文件
      • 上传图片
  • 图片下载

图片上传至服务器

描述

从手机相册中选择一张图片,然后上传至服务器

选取图片

在从相册或者拍摄获取的图片之前,需要进行权限申请,其权限为媒体内容读写权限

‘ohos.permission.READ_MEDIA’ //允许应用读取用户外部存储中的媒体文件信息-用户授权
s’ohos.permission.WRITE_MEDIA’ //允许应用读写用户外部存储中的媒体文件信息-用户授权

从相册选择图片

通过picker.PhotoViewPicker()选择相册内容,在选择之前可以设置选择数量、资源类型等。
例如选取其中一张图片,返回的URI格式如下:

file://media/Photo/2/IMG_1713776063_001/screenshot_20240422_165243.jpg

但此格式并不能直接上传至服务器,需要对其进行拷贝,格式转换等操作,将在下节进行阐述。

  private async openGallery(onSuccess: (uri: string)=> void, onFailed: (error: string)=>void) {try {let PhotoSelectOptions = new picker.PhotoSelectOptions()PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPEPhotoSelectOptions.maxSelectNumber = 1let photoPicker = new picker.PhotoViewPicker()photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: picker.PhotoSelectResult) => {//file://media/Photo/2/IMG_1713776063_001/screenshot_20240422_165243.jpgif (PhotoSelectResult.photoUris.length > 0) {onSuccess(PhotoSelectResult.photoUris[0])}}).catch((err: BusinessError) => {LoggerJoy.error('PhotoViewPicker.select failed with err: ' + JSON.stringify(err))onFailed(err.message)})} catch (error) {let err: BusinessError = error as BusinessErrorLoggerJoy.error('PhotoViewPicker failed with err: ' + JSON.stringify(err))onFailed(err.message)}}

通过拍摄获取图片

通过cameraPicker.pick打开相机页面,如果完成拍照并点击确认,则会返回如上节一样格式的URI

  private async openCamera(onSuccess: (uri: string)=> void, onFailed: (error: string)=>void){try {let pickerProfile: cameraPicker.PickerProfile = {cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK}let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(this),[cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO],pickerProfile)if (pickerResult) {onSuccess( pickerResult.resultUri)}} catch (error) {let err = error as BusinessErrorLoggerJoy.error(`the pick call failed. error code: ${err.code}`)onFailed(err.message)}}

将获取的图片上传至服务器

由于上述获取的文件为file开头,外部并不能直接进行访问,可以将其拷贝到APP目录下的沙箱文件中。由于本Demo采用的是系统提供的request.uploadFile,其路径前缀指定为internal://cache/,所有还需在拷贝之后的新路径前加上此前缀,此前缀对应的是临时目录cacheDir

拷贝文件

拷贝之后的文件存放于应用目录下的沙箱文件中

  private async copyFileToCache(path: string, context: Context): Promise<string>{try {let file = await fs.open(path, fs.OpenMode.READ_WRITE)if (file){let dir =  context.cacheDir + '/avatar'if (!fs.accessSync(dir)) {fs.mkdirSync(dir)}let newpath = context.cacheDir + `/avatar/hohem${new Date().getTime()}.jpg`LoggerJoy.info(`newpath:${newpath}`)await fs.copyFile(file.fd, newpath)return newpath}return ''} catch (err){LoggerJoy.info("applog:open file failed with error message: " + err.message + ", error code: " + err.code)return ''}}

上传图片

在使用request前需要导入对应包

import { BusinessError, request } from ‘@kit.BasicServicesKit’

拷贝之后的路径格式如下

/data/storage/el2/base/haps/entry/cache/avatar/hohem1713924905931.jpg

然后在其前面添加指定前缀internal://cache/,由于此前缀对应的便是cacheDir目录,所以将拷贝之后的路径前面一部分进行省略,最终得到的路径如下

internal://cache/avatar/hohem1713924905931.jpg

若未对路径进行转换,会出现401-the parameters check fails this is fail path异常错误。

在进行上传时,需根据自己云服务器所配置的接受数据格式进行变化request.UploadConfig,例如是PUT还是POST,是否还需其他头参数,例如id、token等

  private async uploadFileToCloud(context: Context, uploadUrl: string, path: string, avatar: string, onSuccess: (avatar: string)=> void, onFailed: (error: string) => void){let newPath = await this.copyFileToCache(path, context)//---/data/storage/el2/base/haps/entry/cache/avatar/hohem1713924905931.jpgnewPath = `internal://cache/${newPath.split("cache/")[1]}` //internal://cache/avatar/hohem1713924905931.jpgLoggerJoy.info(`newpath:${newPath}`)let file: Array<request.File> = [{name: 'avatarName',filename: 'avatarFilename',uri: newPath,type: 'image'}]let config: request.UploadConfig = {url: uploadUrl,method: 'PUT',files: file,header: {'Content-Type': 'application/octet-stream'},data: []}try {request.uploadFile(context,config).then((result)=>{onSuccess(avatar)}).catch((err: BusinessError)=>{onFailed(err.message)})} catch (error) {//401-the parameters check fails   this is fail pathonFailed((error as BusinessError).message)}}

图片下载

下载图片比上传图片简单的多,依旧使用系统提供的request.downloadFileAPI完成。
例如存在https://xxxxxxx.com/system/202403/1773228028463067136.jpgURL图片资源,
为了减少文件名称冗余和唯一性,我们可以只截取最后一部分做为下载之后的图片名称(1773228028463067136.jpg),然后同样保存到应用目录下的沙箱文件下。
最后调用request.downloadFile即可完成对应下载功能

  private downloadImages(context: Context,url: string){let splits = url.split('/')let fileName = splits[splits.length - 1]let basePath = context.cacheDir + '/banner' //:/data/storage/el2/base/haps/entry/cache/banner/1773228028463067136.jpgthis.checkBannerDirExist(basePath) //如果目录不存在,则直接创建目录let config: request.DownloadConfig = {url: url,filePath: `${basePath}/${fileName}`}try {request.downloadFile(context, config, (err: BusinessError, data: request.DownloadTask)=>{if (err) {//下载失败LoggerJoy.info(`write local banner failed:${url}`)return}LoggerJoy.info(`download banner successful:${url}`)//下载成功})} catch (error) {LoggerJoy.info(`write local banner failed:${(error as BusinessError).message}`)}}

http://www.ppmy.cn/news/1465866.html

相关文章

探索iOS上的C语言编程软件:从入门到精通的全方位指南

探索iOS上的C语言编程软件&#xff1a;从入门到精通的全方位指南 在iOS平台上进行C语言编程&#xff0c;虽然不如其他主流编程语言那么普及&#xff0c;但仍然有一批热衷于C语言的开发者们在这个领域里耕耘。本文将深入探索iOS上的C语言编程软件&#xff0c;从四个方面、五个方…

docker一键部署EFK系统(elasticsearch filebeat kibana metricbeat es-head)

EFK日志系统搭建 EFK日志系统介绍功能需求搭建elasticsearch集群规划前提部署核对证书及权限 EFK日志系统介绍 Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎&#xff0c;允许进行全文、结构化搜索&#xff0c;它通常用于索引和搜索大量日志数据&#xff0c;也可用于…

View->Bitmap缩放到自定义ViewGroup的任意区域(Matrix方式绘制Bitmap)

Bitmap缩放和平移 加载一张Bitmap可能为宽高相同的正方形&#xff0c;也可能为宽高不同的矩形缩放方向可以为中心缩放&#xff0c;左上角缩放&#xff0c;右上角缩放&#xff0c;左下角缩放&#xff0c;右下角缩放Bitmap中心缩放&#xff0c;包含了缩放和平移两个操作&#xf…

让低代码平台插上AI的翅膀 - 记开源驰骋AI平台升级

让低代码系统插上AI的翅膀——驰骋低代码开发平台引领新时代 在当今日新月异的科技世界中&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各个行业不可或缺的一部分。从制造业的自动化生产到金融行业的智能风控&#xff0c;再到医疗领域的精准诊断&#xff0c;AI技术…

NoSQL是什么?NoSQL数据库存在SQL注入攻击?

一、NoSQL是什么&#xff1f; NoSQL&#xff08;Not Only SQL&#xff09;是一种非关系型数据库的概念。与传统的关系型数据库不同&#xff0c;NoSQL数据库使用不同的数据模型来存储和检索数据。NOSQL数据库通常更适合处理大规模的非结构化和半结构化数据&#xff0c;且能够…

深度解析:从概念到变革——Transformer大模型的前世今生以及大模型预备知识讲解[知存科技]

深度解析&#xff1a;从概念到变革——Transformer大模型的前世今生 点击&#xff1a;知存科技相关课程推荐 知存科技是全球领先的存内计算芯片企业。针对AI应用场景&#xff0c;在全球率先商业化量产基于存内计算技术的神经网络芯片。凭借颠覆性的技术创新&#xff0c;知存科…

STM32 定时器与PWM的LED控制

学习目标&#xff1a; 1. 使用定时器的某一个通道控制LED周期性亮灭&#xff1b; 2. 采用定时器PWM模式&#xff0c;让 LED 以呼吸灯方式渐亮渐灭。 一、定时器 1、STM32定时器介绍 STMicroelectronics是STM32微控制器中的重要块&#xff0c;具有丰富的外设和功能&#xff0…

宝塔面板搭建thinkphp(fastadmin)项目注意事项

thinkphp宝塔面板部署时可能遇到的问题总结 设置静态伪静态为thinkphp模版数据库要同步代码要全部上传,不要拉下重要文件,原有的ignore文件没有上传thinkphp和vendor文件夹,简单处理的话一起放入git库,push上去权限问题会导致打不开,注意要用www用户775权限fastadmin项目php需…