鸿蒙开发实现图片上传(上传用户头像)

星河特战队员
• 阅读 10

应用场景: 鸿蒙开发实现图片上传(上传用户头像) 鸿蒙开发实现图片上传(上传用户头像) 鸿蒙开发实现图片上传(上传用户头像)

  1. 选择图片

1.1. 添加图片到相册中

默认的相册中无法添加图片:windows 模拟器可以通过截图来添加图片

1.2. 选择相册图片

开发者可以通过系统预置的文件选择器(FilePicker),实现该能力。通过Picker访问相关文件,将拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。

import picker from '@ohos.file.picker';

// 一、定义图片选择 Picker 的配置
// 实例化 选项对象
const photoSelectOptions = new picker.PhotoSelectOptions();
// 过滤选择媒体文件类型为IMAGE
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; 
// 选择媒体文件的最大数目
photoSelectOptions.maxSelectNumber = 1; 


// 二、创建 图片选择对象并选择图片
const photoViewPicker = new picker.PhotoViewPicker();
// 调用 select 方法,传入选项对象
 photoViewPicker.select(photoSelectOptions).then(res=>{
    const uri = res.photoUris[0]
    // 因为只选了一张
    AlertDialog.show({ message: '图片路径为:' + uri })
 })
  1. 拷贝图片到缓存目录 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。

使用上传下载模块,需声明权限:ohos.permission.INTERNET。

应用沙箱目录

使用 fs 模块将上一步的文件,拷贝到 cacheDir 目录下

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

// 三.将文件保存到缓存目录(只能上传在缓存目录中的文件)
const context = getContext(this)
const fileType = 'jpg'
// 生成一个新的文件名
const fileName = Date.now() + '.' + fileType
// 通过缓存路径+文件名 拼接出完整的路径
const copyFilePath = context.cacheDir + '/' + fileName
// 将文件 拷贝到 临时目录
const file = fs.openSync(uri, fs.OpenMode.READ_ONLY)
fs.copyFileSync(file.fd, copyFilePath)
  1. 上传文件 最后,根据接口要求咱们组装数据,并提交给服务器即可

import request from '@ohos.request'; import http from '@ohos.net.http';

// 四、上传图片 // 上传文件 let files: Array<request.File> = [ // internal://cache/ 固定的,后面跟上 咱们上一步拷贝文件名即可 // 【name】 和接口文档的要求对上 { filename: fileName, type: fileType, name: 'img', uri: internal://cache/${fileName} } ]

request.uploadFile(context, { url: '接口地址', // url 地址 method: 请求方法, // 请求方法 header: { // 和接口文档的要求的格式对象 contentType: '', }, files, // 文件信息 data: [] // 额外提交的数据,不能省略 }) .then((res => { // 这里可以获取到响应的内容 res.on('headerReceive', (value) => { // body 是 JSON 是响应体 // AlertDialog.show({ // message: JSON.stringify(value) // })

    // 根据接口文档 转为对应的类型即可

    const uploadRes = (value as UploadResponse)
    const response = JSON.parse(uploadRes.body) as Response
    AlertDialog.show({
      message: response.data.url
    })
    console.log('上传的地址为:', response.data.url)

  })
}))
完整代码展示:
``` language
import picker from '@ohos.file.picker';

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

import request from '@ohos.request';
import http from '@ohos.net.http';

// 定义类型
interface UploadResponse {
  body: string
}

export interface Response {
  /**
   * 业务状态码,10000成功, 其他失败
   */
  code: number;

  /**
   * 响应数据
   */
  data: Data;

  /**
   * 响应消息
   */
  message: string;
}

/**
 * 响应数据
 */
export interface Data {
  /**
   * 上传成功的图片-在线地址
   */
  url: string;
}


// 实例化 选项对象
const photoSelectOptions = new picker.PhotoSelectOptions();
// 过滤选择媒体文件类型为IMAGE
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
// 选择媒体文件的最大数目
photoSelectOptions.maxSelectNumber = 1;

@Entry
@Component
struct Page03_uploadImg {
  build() {
    Navigation() {

      Column() {
        Image('http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/ajax/17128585871360.5802423440443907.jpg')
        Button('选择并上传图片')
          .onClick(() => {
            // 创建 图片选择对象
            const photoViewPicker = new picker.PhotoViewPicker();
            // 调用 select 方法,传入选项对象
            photoViewPicker.select(photoSelectOptions)
              .then(res => {
                const uri = res.photoUris[0]
                // 因为只选了一张
                // AlertDialog.show({ message: '图片路径为:' + uri })

                // 三、拷贝文件到缓存目录
                // 将文件保存到缓存目录(只能上传在缓存目录中的文件)
                const context = getContext(this)
                const fileType = 'jpg'
                // 生成一个新的文件名
                const fileName = Date.now() + '.' + fileType
                // 通过缓存路径+文件名 拼接出完整的路径
                const copyFilePath = context.cacheDir + '/' + fileName

                // 将文件 拷贝到 临时目录
                const file = fs.openSync(uri, fs.OpenMode.READ_ONLY)
                fs.copyFileSync(file.fd, copyFilePath)

                // 四、上传图片
                // 上传文件
                let files: Array<request.File> = [
                // internal://cache/ 固定的,后面跟上 咱们上一步拷贝文件名即可
                // name 和接口文档的要求对上
                  { filename: fileName, type: fileType, name: 'img', uri: `internal://cache/${fileName}` }
                ]

                request.uploadFile(context, {
                  url: 'https://hmajax.itheima.net/api/uploadimg', // url 地址
                  method: http.RequestMethod.POST, // 请求方法
                  header: {
                    // 和接口文档的要求的格式对象
                    contentType: 'multipart/form-data',
                  },
                  files, // 文件信息
                  data: [] // 额外提交的数据,不能省略
                })
                  .then((res => {
                    // 这里可以获取到响应的内容
                    res.on('headerReceive', (value) => {
                      // body 是 JSON
                      // AlertDialog.show({
                      //   message: JSON.stringify(value)
                      // })

                      const uploadRes = (value as UploadResponse)
                      const response = JSON.parse(uploadRes.body) as Response
                      AlertDialog.show({
                        message: response.data.url
                      })
                      console.log('上传的地址为:', response.data.url)

                    })
                  }))

              })

          })
      }
    }
    .titleMode(NavigationTitleMode.Mini)
    .title('上传图片')

  }
}

#DevEco Studio# #社交#

点赞
收藏
评论区
推荐文章
李志宽 李志宽
2年前
【小白必学】文件上传的漏洞介绍及常见防御方法
01文件上传漏洞原理在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。02文件上传漏洞触发点相册、头像上传、视频、照片分享、附件上传(论坛发帖、邮箱
ThinkPHP V5.0 图片上传base64
/单图上传@returnbool|mixed|string/protectedfunctionuploadingqrcode($images'',$name'')if(empty($images))$thisresult($images,0,'图片错误');if(pregmatch('/^(data:\simag
happlyfox happlyfox
4年前
.net web core 如何编码实现文件上传功能
关于我前言在进行Web前后端分析开始时,我们经常会碰到文件上传的需求。上传用户头像,上传认证材料、审核材料等,这些都可以归类为文件上传功能。今天主要把自己在开发过程中的心得进行一个整理,供大家学习。开启静态文件中间件默认情况下,静态文件(如HTML、CSS、图像和JavaScript)是ASP.NETCore应用直接提供给客户端的资产。开启静态
Easter79 Easter79
3年前
SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑
本文源码GitHub地址:知了一笑https://github.com/cicadasmile/springbootbase一、文件上传文件上传是项目开发中一个很常用的功能,常见的如头像上传,各类文档数据上传等。SpringBoot使用MultiPartFile接收来自表单的file文件,然后执
Stella981 Stella981
3年前
SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑
本文源码GitHub地址:知了一笑https://github.com/cicadasmile/springbootbase一、文件上传文件上传是项目开发中一个很常用的功能,常见的如头像上传,各类文档数据上传等。SpringBoot使用MultiPartFile接收来自表单的file文件,然后执
Stella981 Stella981
3年前
HTML5 file API加canvas实现图片前端JS压缩并上传
一、图片上传前端压缩的现实意义对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验。这种体验包括两方面:1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险。2.最最重要的体验改进点:省略了图片的再加工成本。很多网站的图片上传功能都会对图片的大小进
Stella981 Stella981
3年前
Spring Boot 2.x基础教程:实现文件上传
文件上传的功能实现是我们做Web应用时候最为常见的应用场景,比如:实现头像的上传,Excel文件数据的导入等功能,都需要我们先实现文件的上传,然后再做图片的裁剪,excel数据的解析入库等后续操作。今天通过这篇文章,我们就来一起学习一下如何在SpringBoot中实现文件的上传。动手试试第一步:创建一个基础的SpringBo
少湖说 少湖说
6个月前
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
使用ArkTs开发Flutter鸿蒙平台插件本文讲述如何开发一个Flutter鸿蒙插件,如何实现Flutter与鸿蒙的混合开发,以及双端消息通信。Flutter侧,编写MethodChanneldartconstMethodChannelmethodCha
京东云开发者 京东云开发者
6个月前
Taro 鸿蒙技术内幕系列(四):JDImage 自研鸿蒙图片库
作者:京东零售何骁基于Taro打造的京东鸿蒙APP已跟随鸿蒙Next系统公测,本系列文章将深入解析Taro如何实现使用React开发高性能鸿蒙应用的技术内幕背景2024年初,京东正式启动了鸿蒙APP的开发工作。由于电商APP大量依赖图片来展示商品信息,对图
沉浸式趣谈 沉浸式趣谈
3个月前
我悟了!原来本地图片预览还能这样搞
在网页开发中,经常会遇到需要让用户上传图片并在上传前进行预览的需求。这样做的好处显而易见:用户可以立即看到自己选择的图片是否正确,避免了不必要的上传和服务器资源浪费,提升了用户体验。
星河特战队员
星河特战队员
Lv1
过尽征鸿来尽燕,故园消息茫然。
文章
1
粉丝
0
获赞
0
热门文章

暂无数据