HarmonyOS 鸿蒙Next中如何将沙盒中的文件转成ArrayBuffer

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

HarmonyOS 鸿蒙Next中如何将沙盒中的文件转成ArrayBuffer 有个需求就是录制音频文件并使用阿里的录音转文字功能,我使用的是url请求的方式,文档如下: https://help.aliyun.com/zh/isi/developer-reference/restful-api-2?spm=a2c4g.11186623.0.0.14a76b9bSAbLSH#section-383-ee8-12i

我在鸿蒙中应该如何去发起该请求呢?

是不是在HttpRequestOptions的extraData字段中传入文件的ArrayBuffer,但我应该如何将文件转成ArrayBuffer呢,还是说是其它方式呢?


更多关于HarmonyOS 鸿蒙Next中如何将沙盒中的文件转成ArrayBuffer的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

读取文件转换为buferArray的数组的代码demo实例如下

ArrayBuffer最大长度就是4096 对于一整个文件 没办法读取完整 可以在每次读取之后使用@ohos.buffer (Buffer)中的Buffer对象存储本次读取的值 在全部读取完成后 使用buffer.concat()合并所有Buffer的内容

import { BusinessError } from '[@ohos](/user/ohos).base';
import buffer from '[@ohos](/user/ohos).buffer';
import fs from '[@ohos](/user/ohos).file.fs';
import common from '[@ohos](/user/ohos).app.ability.common';

let context = this as common.UIAbilityContext;

@Entry
@Component
struct Page76 {
  @State message: string = 'Hello World';

  build() {
    Column() {
      Button('rawfile To 沙箱')
        .onClick(() => {
          this.rawToFile()
        })
      Button('fileToArrayBuffer')
        .onClick(() => {
          this.fileToArrayBuffer()
        })
      Button('fileToArrayBufferreadLocalFileWithStream')//文件比较大使用
        .onClick(() => {
          this.readLocalFileWithStream()
        })
    }
  }

  rawToFile() {
    context.resourceManager.getRawFileContent('1.txt', (_err, value) => {
      let myBuffer: ArrayBufferLike = value.buffer;
      console.log("filesDir:" + context.filesDir);
      let file = fs.openSync(context.filesDir + '/1.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      let writeLen = fs.writeSync(file.fd, myBuffer);
      console.info("写入数据和文件成功:" + writeLen);
      fs.closeSync(file);
    });
  }

  fileToArrayBuffer() {
    let filePath = context.filesDir + "/1.txt";
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
    let arrayBuffer = new ArrayBuffer(4096);
    fs.read(file.fd, arrayBuffer, (err: BusinessError, readLen: number) => {
      if (err) {
        console.error("read failed with error message: " + err.message + ", error code: " + err.code);
      } else {
        let buf = buffer.from(arrayBuffer, 0, readLen);
        console.info(`The content of file: ${buf.toString()}`);
      }
      fs.closeSync(file);
    });
  }

  async readLocalFileWithStream() {
    try {
      let buffers: buffer.Buffer[] = [];
      let inputStream = fs.createStreamSync(context.filesDir + '/1.txt', 'r+');
      let bufSize = 4096;
      let readSize = 0;
      let buf = new ArrayBuffer(bufSize);
      class Option {
        public offset: number = 0;
        public length: number = bufSize;
      }
      let option = new Option();
      option.offset = readSize;
      let readLen = await inputStream.read(buf, option);
      buffers.push(buffer.from(buf.slice(0, readLen)))
      readSize += readLen;
      while (readLen > 0) {
        option.offset = readSize;
        readLen = await inputStream.read(buf, option);
        buffers.push(buffer.from(buf.slice(0, readLen)))
        readSize += readLen;
      }
      inputStream.closeSync();
      let finalBuf: ArrayBuffer = buffer.concat(buffers).buffer;
      console.info(`final ArrayBuffer byteLength is ${finalBuf.byteLength}`)
    } catch (error) {
      let err = error as BusinessError;
      console.error(`readLocalFileWithStream failed, code is ${err.code},message is ${err.message}`);
    }
  }
}

更多关于HarmonyOS 鸿蒙Next中如何将沙盒中的文件转成ArrayBuffer的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,将沙盒中的文件转换为ArrayBuffer可以通过使用FileIO模块来实现。首先,使用FileIO.open方法打开沙盒中的文件,获取文件描述符。然后,使用FileIO.read方法读取文件内容到一个Uint8Array中。最后,将Uint8Array转换为ArrayBuffer

以下是示例代码:

import fileio from '@ohos.fileio';

// 假设文件路径为沙盒中的某个路径
let filePath = 'your_sandbox_file_path';

// 打开文件
let file = fileio.open(filePath, fileio.OpenMode.READ_ONLY);

// 获取文件大小
let stat = fileio.stat(filePath);
let fileSize = stat.size;

// 创建一个Uint8Array来存储文件内容
let buffer = new Uint8Array(fileSize);

// 读取文件内容到Uint8Array
fileio.read(file.fd, buffer, { length: fileSize });

// 将Uint8Array转换为ArrayBuffer
let arrayBuffer = buffer.buffer;

// 关闭文件
fileio.close(file.fd);

在HarmonyOS鸿蒙Next中,可以通过FileFileReader API将沙盒中的文件转换为ArrayBuffer。首先,使用File对象获取文件,然后通过FileReaderreadAsArrayBuffer方法读取文件内容。示例代码如下:

let file = new File('path/to/sandbox/file');
let reader = new FileReader();
reader.onload = function(event) {
    let arrayBuffer = event.target.result;
    // 处理ArrayBuffer
};
reader.readAsArrayBuffer(file);

确保文件路径正确,并在onload回调中处理ArrayBuffer数据。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!