HarmonyOS鸿蒙Next文件上传

HarmonyOS鸿蒙Next文件上传 我这边从相册里已经拿到了路径了: file://media/Photo/6/IMG_1712626998_005/screenshot_20240409_094137.jpg 然后网络请求框架用的axios,然后不知道怎么把这个路径转成file去上传,axios框架里说是用arrayBuffer,和uri  (internal://cache)这种类型,这种uri不知道怎么获取,arrayBuffer我按照文档上的去转换,貌似转出来是个空的,不知道能否提供一个选择文件之后开始上传文件的demo呢?

头像上传

4 回复

// 获取到相册选择图片的URI const PERMISSIONS: Array<Permissions> = [ ‘ohos.permission.READ_MEDIA’, ‘ohos.permission.WRITE_MEDIA’ ];

let context = getContext(this) as common.UIAbilityContext; let atManager = abilityAccessCtrl.createAtManager();

await atManager.requestPermissionsFromUser(context, PERMISSIONS);

const photoSelectOption = new picker.PhotoSelectOptions(); photoSelectOption.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; photoSelectOption.maxSelectNumber = 2;

const photoViewPicker = new picker.PhotoViewPicker(); photoViewPicker.select(photoSelectOption) .then(async (photoSelectResult) => { this.uris = photoSelectResult.photoUris; }) .catch((err: BusinessError) => { console.info(Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}); });

// axios上传类型支持uri和ArrayBuffer

// 转化为internal://cache fs.open(this.uris[0], fs.OpenMode.READ_ONLY) .then((file) => { // READ_ONLY READ_WRITE let newPath = this.context.cacheDir + /test.png; fs.copyFile(file.fd, newPath) .then(() => { console.info(“applog: copy file succeed”); let realUri = “internal://cache/” + newPath.split(“cache/”)[1]; console.log('realUri: ’ + JSON.stringify(realUri)); }) .catch((err: BusinessError) => { console.info("applog: copy file failed with error message: " + err.message + ", error code: " + err.code); }); }) .catch((err: BusinessError) => { console.info("applog: open file failed with error message: " + err.message + ", error code: " + err.code); });

// 转化为ArrayBuffer let file = fs.openSync(this.uris[0], fs.OpenMode.READ_ONLY); const imageSource = image.createImageSource(file.fd); fs.closeSync(file);

const imagePackApi = image.createImagePacker(); let packOpts: image.PackingOption = { format: “image/png”, quality: 100 };

imagePackApi.packing(imageSource, packOpts) .then(readBuffer => { let bufferArr = new Uint8Array(readBuffer); console.log('bufferArr: ’ + JSON.stringify(bufferArr)); });

// 复制文件 let file = fs.openSync(this.uris[0], fs.OpenMode.READ_ONLY); let file2 = fs.openSync(this.filesDir + ‘/test.jpg’, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); fs.copyFileSync(file.fd, file2.fd); // 先创建有读写权限的文件,再把不可读写的文件复制过来

fs.closeSync(file); fs.closeSync(file2);

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


将图片的url, 转换为arrayBuffer

  transitionImage2Buffer(uri: string): ArrayBuffer {
    // 读取图片为buffer
    const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    this.photoSize = fs.statSync(file.fd).size;
    let imageArraybuffer = new ArrayBuffer(this.photoSize);
    fs.readSync(file.fd, imageArraybuffer);
    fs.closeSync(file);
    return imageArraybuffer
  }

axios 有 upload 的demo

https://ohpm.openharmony.cn/#/cn/detail/

HarmonyOS鸿蒙Next中的文件上传功能主要通过ohos.file.fsohos.file.upload模块实现。ohos.file.fs模块提供了文件系统操作的基本接口,如文件读取、写入、删除等。ohos.file.upload模块则专门用于文件上传,支持多线程上传、断点续传、上传进度监控等功能。

在HarmonyOS鸿蒙Next中,文件上传的典型流程如下:

  1. 获取文件:使用ohos.file.fs模块的接口获取要上传的文件。
  2. 创建上传任务:通过ohos.file.upload模块的UploadTask类创建上传任务,设置上传的URL、文件路径、请求头等参数。
  3. 启动上传:调用UploadTaskstart方法启动上传任务。
  4. 监控上传进度:通过UploadTaskonProgress回调方法实时监控上传进度。
  5. 处理上传结果:通过UploadTaskonCompleteonError回调方法处理上传成功或失败的情况。

ohos.file.upload模块还支持上传任务的暂停、恢复和取消操作,适用于需要灵活控制上传过程的场景。

在HarmonyOS鸿蒙Next中,文件上传可以通过ohos.file.fs模块或@ohos.net.http模块实现。使用ohos.file.fs可以读取本地文件,而@ohos.net.http则用于HTTP请求。首先,获取文件路径并读取文件内容,然后通过HTTP请求将文件数据上传到服务器。具体步骤包括:

  1. 使用fs.openSync打开文件;
  2. 使用fs.readSync读取文件数据;
  3. 使用http.createHttp创建HTTP请求;
  4. 设置请求头并发送数据。

确保处理异步操作和错误捕获。

回到顶部