HarmonyOS 鸿蒙Next 相册图片上传问题

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 相册图片上传问题

在一个项目中提供用户设置头像功能,用户在相册中选取图片上传。问题是无法直接把用户选择的图片在相册中直接上传到服务器,有些资料中提到安全性不允许这种操作。我现在的做法是先把相册图片拷贝到自己应用目录,然后上传自己目录中的图片。不知道这样做是否合适?或者各位大佬有否更好的解决办法?

2 回复

可以参考一下上传下载demo:https://gitee.com/harmonyos_samples/upload-and-down-load

也可以参考一下这个代码片段:

import request from '[@ohos](/user/ohos).request';
import picker from '[@ohos](/user/ohos).file.picker';
import fs, { ReadOptions } from '[@ohos](/user/ohos).file.fs';
import common from '[@ohos](/user/ohos).app.ability.common';


// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index4 {
 private openPhotoPicker() {
   let photoPicker = new picker.PhotoViewPicker();
   photoPicker.select({
     MIMEType: picker.PhotoViewMIMETypes.IMAGE_TYPE,
     maxSelectNumber: 1
   }, (error, 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 uploadConfig: request.UploadConfig = {
     url: 'http://XXX&#34',
     header: header,
     method: 'POST',
     files: allFiles,
     data: data
   }
   try {
     request.uploadFile(getContext(this), uploadConfig, (error, uploadTask) => {
       if(uploadTask) {
         uploadTask.on('progress', (uploadedSize: number, totalSize: number) => {
           console.log("progress, uploadedSize: " + uploadedSize + ", totalSize: " + totalSize)
         })
       } else {
         console.log("upload failure: " + error)
       }
     });
   } catch (error) {
     console.log("upload failure: " + error)
   }
 }
}

可以通过on('headerReceive')订阅上传任务HTTP响应事件responsehttps://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-request-V5#onheaderreceive7

更多关于HarmonyOS 鸿蒙Next 相册图片上传问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next相册图片上传问题,作为IT专家,我提供以下信息:

HarmonyOS鸿蒙Next系统中,由于文件管理器和图库完全隔离的新规格,可能会遇到图片上传受限的情况。特别是当尝试通过某些应用或服务上传相册中的图片时,可能会遇到路径或权限问题。

首先,确保应用已正确申请并获得了媒体内容读写权限(ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA)。其次,由于直接从相册选择的图片URI可能无法直接用于上传,需要将图片拷贝到应用目录下的沙箱文件中,并转换为可被外部访问的路径格式。这通常涉及文件拷贝和路径转换操作。

此外,如果是HarmonyOS 3.0及以上华为手机,并遇到特定相册(如相机相册)图片无法上传的问题,尝试重新开关手机图库与存储服务的同步功能,并确保在网络条件良好的情况下触发同步。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部