HarmonyOS 鸿蒙Next中如何将沙盒中的文件转成ArrayBuffer
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
读取文件转换为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);