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

HarmonyOS 5.1.1版本图片上传功能

一、服务端实现(Spring Boot)

服务端采用Spring Boot框架接收图片上传请求,核心实现如下:

接口设计

  • 请求方式:POST
  • 内容类型:multipart/form-data
  • 接口路径:/updateAvatar
  • 文件参数名:file(与客户端保持一致)

核心代码

@PostMapping("updateAvatar")
fun updateAvatar(@RequestParam("file") file: MultipartFile?,
): GeneralResult<LoginResultVO> {return GeneralResult.success(userService.modifyUserAvatarUrl(file))
}

服务端通过@RequestParam("file")注解接收客户端上传的图片文件,类型为MultipartFile,然后调用业务层方法处理文件并返回结果。

二、鸿蒙客户端实现

鸿蒙客户端实现图片上传功能主要分为四个步骤:选择图片、读取文件、上传文件,全程无需申请文件访问权限,仅访问用户明确选择的文件。

1. 选择图片(PhotoViewPicker)

使用鸿蒙系统提供的photoAccessHelper.PhotoViewPicker组件实现图片选择,该组件无需额外权限申请,仅能访问用户明确选择的图片。

实现步骤:

初始化选择器

// 初始化图片选择器
photoPicker = new photoAccessHelper.PhotoViewPicker();// 配置选择参数
options: photoAccessHelper.PhotoSelectOptions = {maxSelectNumber: 1, // 限制最大选择数量为1张MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE // 仅允许选择图片类型
};

调用选择器并处理结果

// 调用选择器
this.photoPicker.select(this.options).then((result) => {let uriList = result.photoUris; // 获取选中图片的URI数组// 判断是否选择了图片if (ArrayUtil.isNotEmpty(uriList)) {this.viewModel.state.imageUri = uriList[0]; // 保存选中图片的URIthis.viewModel.updateAvatar(); // 触发上传操作}}).catch((err: BusinessError) => {// 处理选择过程中的异常console.error("图片选择失败:" + err.message);});

2. 读取文件内容

选择图片后获得的是图片的URI,不能直接用于上传,需要通过文件IO操作读取文件内容到ArrayBuffer中。

// 打开文件,以只读模式
let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);// 获取文件信息(包括文件大小)
let fileStat = fileIo.statSync(file.fd);// 初始化与文件大小匹配的缓冲区
let arrayBuffer = new ArrayBuffer(fileStat.size);// 将文件内容读取到缓冲区
let readLen = fileIo.readSync(file.fd, arrayBuffer);// 验证读取长度是否与文件大小一致
if (readLen !== fileStat.size) {console.warn("文件读取不完整,实际读取:" + readLen + ",文件大小:" + fileStat.size);
}// 关闭文件,释放资源
fileIo.closeSync(file);// 从URI中提取文件名
const fileName = uri.substring(uri.lastIndexOf('/') + 1);

3. 上传文件(NetworkKit)

使用鸿蒙@kit.NetworkKit提供的HTTP能力实现文件上传,核心是配置multipart/form-data类型的请求。

封装上传方法
static postFile<T>(url: string, fileData: ArrayBuffer, fileName: string): Promise<Result<T>> {// 创建HTTP请求对象let httpRequest = http.createHttp();return new Promise<Result<T>>((resolve) => {// 发起POST请求httpRequest.request(HttpService.BASE_URL + url,{method: http.RequestMethod.POST,header: {// 必须指定为multipart/form-data类型'Content-Type': 'multipart/form-data'},// 配置表单数据multiFormDataList: [ {name: 'file',  // 与服务端定义的参数名保持一致contentType: 'image/*', // 图片类型data: fileData, // 文件内容(ArrayBuffer)remoteFileName: fileName // 文件名}],expectDataType: http.HttpDataType.STRING // 预期返回数据类型},(err: BusinessError | undefined, data: http.HttpResponse) => {// 清理HTTP资源的函数const cleanup = () => {try {httpRequest.destroy();console.info('[HTTP] 请求资源已销毁');} catch (destroyError) {console.error('[HTTP] 销毁请求时出错:', destroyError);}};// 处理响应结果(根据实际业务需求实现)if (err) {resolve({ success: false, error: err.message });} else {resolve({ success: true, data: JSON.parse(data.result as string) });}// 清理资源cleanup();});  });  
}
调用上传方法
// 调用封装的上传接口
let result = await ApiService.updateAvatar(arrayBuffer, fileName);
// 处理上传结果
if (result.success) {console.info("图片上传成功");
} else {console.error("图片上传失败:" + result.error);
}

三、实现要点总结

  1. 权限处理:使用PhotoViewPicker无需申请文件访问权限,仅访问用户明确选择的文件,更符合隐私保护要求。

  2. 数据流转

    • 客户端:URI → ArrayBuffer → 表单数据 → 服务端
    • 服务端:MultipartFile → 业务处理
  3. 关键匹配项

    • 客户端multiFormDataList中的name属性需与服务端@RequestParam的参数名一致(均为"file")
    • 内容类型需统一为multipart/form-data
  4. 资源管理:文件操作和网络请求完成后需及时释放资源,避免内存泄漏。

通过以上实现,鸿蒙5.1.1应用可以安全、高效地实现图片上传功能,兼顾用户体验与系统安全性。


文章转载自:

http://OXf3Mh8n.qpqcq.cn
http://5cll2rAZ.qpqcq.cn
http://Cc4Ukjnp.qpqcq.cn
http://sYBKb45h.qpqcq.cn
http://bSdzluDV.qpqcq.cn
http://LXekNrrH.qpqcq.cn
http://dbkOGsK8.qpqcq.cn
http://OzQ9QCjt.qpqcq.cn
http://oNSAXnnd.qpqcq.cn
http://RiPK4Sha.qpqcq.cn
http://Ut1p0FBk.qpqcq.cn
http://I57PULsV.qpqcq.cn
http://VfNlTjgM.qpqcq.cn
http://bMle85aI.qpqcq.cn
http://teYRyxHi.qpqcq.cn
http://NQExTjTa.qpqcq.cn
http://ErYCYWCo.qpqcq.cn
http://rHuqax7K.qpqcq.cn
http://gqkeMwd1.qpqcq.cn
http://IKGcxilR.qpqcq.cn
http://DPqgLcN4.qpqcq.cn
http://u5lCNgC7.qpqcq.cn
http://75NNaqGp.qpqcq.cn
http://gyqOsZig.qpqcq.cn
http://MiCJedmD.qpqcq.cn
http://GrcGWdMi.qpqcq.cn
http://MMrhhCiC.qpqcq.cn
http://06wAw2Os.qpqcq.cn
http://8YzfaU7E.qpqcq.cn
http://162Sa74U.qpqcq.cn
http://www.dtcms.com/a/374408.html

相关文章:

  • 2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
  • Puter+CPolar低成本替代商业网盘,打造私有云新势力
  • Deepoc科技之暖:智能助盲设备如何为视障家人点亮生活
  • 详细的vmware虚拟机安装教程
  • uni-app 项目中使用自定义字体
  • springboot maven 多环境配置入门与实战
  • 时序数据库选型指南:基于大数据视角的IoTDB应用优势分析详解!
  • 炫光活体检测技术:通过光学技术实现高效、安全的身份验证,有效防御多种伪造手段。
  • sqlite3的加解密全过程
  • Django REST Framework 中 @action 装饰器详解
  • 【Docker】一键将运行中的容器打包成镜像并导出
  • LLVM 数据结构简介
  • MCP与http、websocket的关系
  • 【modbus学习】
  • 【linux】sed/awk命令检索区间日志
  • 瑞派虹泰环城总院 | 打造“一站式宠物诊疗空间”,定义全国宠物医疗新高度
  • 数据分析画图显示中文
  • 嵌入式ARM架构学习3——启动代码
  • 2025云计算趋势:Serverless与AI大模型如何赋能中小企业
  • 如何利用 AWS 服务器优化跨境电商和 SEO 战略?
  • 大数据毕业设计-基于Python的中文起点网小说数据分析平台(高分计算机毕业设计选题·定制开发·真正大数据)
  • 小程序开发单行日历可滑动
  • 项目日记 -日志系统 -搭建基础框架
  • 计算机网络第四章(4)——网络层《ARP协议》
  • 探迹SalesGPT
  • 带有 Attention 机制的 Encoder-Decoder 架构模型分析
  • 利用易语言编写,逻辑为按照数字越大抽取率越前
  • leetcode 219 存在重复元素II
  • Redis(缓存)
  • ARP 协议