本文介绍如何保存Base64的文件到Download下
参考文档地址:
保存用户文件-Harmony Next
用到的是DOWNLOAD模式保存文件
用户在使用save接口时,可以将pickerMode配置为DOWNLOAD模式,该模式下会拉起授权接口,用户确认后会在公共路径download目录下创建用户当前hap包名的文件夹,并通过save接口返回值回传相应的URI,后续用户可以直接将文件保存在该URI下。
本文里面的Base64Utils和JSONutils都是来自于:
@pura/harmony-utils 1.0.2
参考代码如下
param =
"{\"dataBase64\":\"data:audio/midi;base64,TVRoZAAAAAYAAQACAeBNVHJrAAAAIQD/UQMLcbAA/1kCAAAA/1gEBAIYCAD/AQR0dHR0AP8vAE1UcmsAAACrAMAAALB5AACwQAAAsFswALAKQACwB2QAkEdpgXCARwAAkEdVgXCARwAAkEdfgXCARwAAkEdVgXCARwAAkEBfgXCAQAAAkEVVgXCARQAAkD5fgXCAPgAAkENVgXCAQwAAkEdfgXCARwAAkEdVgXCARwAAkEdfgXCARwAAkEdVgXCARwAAkEBfgXCAQAAAkENVgXCAQwAAkEBfgXCQRVUDgEAAgXCARQAA/y8A\",\"fileType\":\"midi\",\"fileName\":\"tttt\"}"
if (StringUtils.isStrNotBlank(param)) {
const h5CallBackBean: H5CallBackBean | null = JSONUtil.jsonToBean<H5CallBackBean>(H5CallBackBean, param)
if (h5CallBackBean) {
if ('midi' == h5CallBackBean.fileType) {
const fileBase64 = h5CallBackBean.dataBase64
if (StringUtils.isStrNotBlank(fileBase64)) {
const base64: string = fileBase64.split(",")[1]
const numTemp: number = DateUtil.getTodayTime()
let uri: string = '';
// 请确保 getContext(this) 返回结果为 UIAbilityContext
let context = getContext(this) as common.Context;
const documentViewPicker = new picker.DocumentViewPicker(context);
const documentSaveOptions = new picker.DocumentSaveOptions();
documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;
// documentSaveOptions.newFileNames = [numTemp + '.midi']
documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
uri = documentSaveResult[0];
console.info('documentViewPicker.save succeed and uri is:' + uri);
//得到uri后,需要使用FileUri做一层转换,才可以做后续读写的操作
let path: string = new fileUri.FileUri(uri).path
//得到path后拼接文件名
let filePath: string = `${path}/${numTemp}.midi`;
if (StringUtils.isStrNotBlank(filePath)) {
if (UiUtils.saveBase64File(base64,filePath)) {
ToastUtil.showToast("保存成功")
}
}
}).catch((err: BusinessError) => {
console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
})
}
}
}
/**
*保存base64文件
*
* @param context上下文
* @param base64base64文件内容
* @param filePath文件路径
* @returns是否保存成功
*/
public static saveBase64File(base64: string, filePath: string): boolean {
if (!base64 || !filePath) {
return false;
}
const imageBuffer = Base64Util.decodeSync(base64);
try {
//这边要多加一个fs.OpenMode.CREATE得到创建文件的权限
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
console.info("file fd: " + file.fd);
//因为writeSync的入参类型是ArrayBuffer或string,所以这边要使用.buffer转换成ArrayBuffer类型,否则会报错。
fs.writeSync(file.fd, imageBuffer.buffer);
fs.closeSync(file);
} catch (err) {
Logger.error(CommonConstants.TAG, `saveBase64File err: ${err}`);
return false;
}
return true;
}
需要注意的是:
1.得到uri后,需要使用FileUri做一层转换,才可以做后续读写的操作
2.因为writeSync的入参类型是ArrayBuffer或string,所以这边要使用.buffer转换成ArrayBuffer类型,否则会报错。
否则出现Error: Operation not permitted,
防止以后出错,特此记录