HarmonyOS 鸿蒙Next中二进制的PDF文件保存问题
HarmonyOS 鸿蒙Next中二进制的PDF文件保存问题 二进制的PDF文件能保存文件到Download里吗?,如何把二进制的PDF文件保存到本地?
3 回复
【解决方案】
可以将二进制流如ArrayBuffer先保存到沙箱目录中,然后在保存到用户文件目录。
可以参考代码,这边已下载一个pdf为例,下载到沙箱后通过documentViewPicker保存到Download目录里:
import { BusinessError, request } from '@kit.BasicServicesKit';
import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import { common } from '@kit.AbilityKit';
import { buffer } from '@kit.ArkTS';
const context = getContext(this);
@Entry
@Component
struct DocumentSave {
@State message: string = '下载文件';
build() {
RelativeContainer() {
Button('保存到用户目录').onClick(() => {
let file = fs.openSync(context.filesDir + '/aa.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let fileb = fs.openSync(context.filesDir + '/bb.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let arrayBuffer = new ArrayBuffer(4096000);
let readLen = fs.readSync(file.fd, arrayBuffer);
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info(`content of File: ${buf.toString()}`);
let writeLen = fs.writeSync(fileb.fd, arrayBuffer);
//将文件复制到文件夹中
const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例
documentSaveOptions.newFileNames = ["bbb.pdf"]; // 保存文件名(可选)
const documentViewPicker = new picker.DocumentViewPicker;
documentViewPicker.save(documentSaveOptions).then(async (documentSaveResult) => {
// 获取到到图片或者视频文件的URI后进行文件读取等操作
let uri = documentSaveResult[0];
console.info('pub uri:' + uri)
// 沙箱路径文件
let sanFile = fs.openSync(context.filesDir + '/bb.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
let pubFile = fs.openSync(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
// 将文件从沙箱路拷贝到公共路径
fs.copyFileSync(sanFile.fd, pubFile.fd)
fs.closeSync(pubFile.fd)
fs.closeSync(fileb.fd)
fs.closeSync(file);
console.log("-------")
})
})
Button(this.message)
.id('DocumentSaveHelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.fontColor(Color.Pink)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
const downloadUrl =
"https://xx/sample.pdf";
try {
request.downloadFile(context, {
enableMetered: true,
url: downloadUrl,
filePath: context.filesDir + '/aa.pdf'
}).then((downloadTask: request.DownloadTask) => {
downloadTask.on('fail', (err: number) => {
console.error(`Failed to download the task. Code: ${err}`);
});
downloadTask.on('progress', (receivedSize: number, totalSize: number) => {
console.log('download', "receivedSize:" + (receivedSize / 1024) + " totalSize:" + (totalSize / 1024));
});
downloadTask.on('complete', () => {
console.info('download complete');
let file = fs.openSync(context.filesDir + '/aa.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let arrayBuffer = new ArrayBuffer(4096000);
let readLen = fs.readSync(file.fd, arrayBuffer);
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info(`content of File: ${buf.toString()}`);
let writeLen = fs.writeSync(file.fd, arrayBuffer);
fs.closeSync(file);
})
}
// 下载完成
)
.catch((err: BusinessError) => {
console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
}
})
}
.height('100%')
.width('100%')
}
}
更多关于HarmonyOS 鸿蒙Next中二进制的PDF文件保存问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,二进制PDF文件保存需使用@ohos.file.fs
模块的API。通过fs.openSync()
以二进制模式打开或创建文件,路径应使用应用沙箱目录。使用fs.writeSync()
将包含PDF数据的ArrayBuffer写入文件句柄,操作完成后调用fs.closeSync()
释放资源。需在module.json5中声明文件读写权限。
在HarmonyOS Next中,可以通过文件管理API将二进制PDF文件保存到Download目录。具体步骤如下:
- 使用
@ohos.file.fs
模块的fs.open
方法创建或打开目标文件(路径可设为'Download/xxx.pdf'
)。 - 通过
fs.write
将二进制数据(如ArrayBuffer)写入文件。 - 调用
fs.close
关闭文件句柄。
示例代码片段:
import fs from '@ohos.file.fs';
let filePath = 'Download/example.pdf';
let binaryData; // 你的PDF二进制数据(ArrayBuffer类型)
fs.open(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE).then((file) => {
fs.write(file.fd, binaryData).then(() => {
fs.close(file.fd);
console.log('PDF保存成功');
});
});
注意:
- 需在
module.json5
中申请ohos.permission.READ_MEDIA
和ohos.permission.WRITE_MEDIA
权限。 - 文件路径需使用沙箱路径或公共目录访问方式(通过
@ohos.file.fileuri
转换)。 - 二进制数据需确保格式正确,否则可能导致文件损坏。