uni-app中writer.write()写入pdf异常
uni-app中writer.write()写入pdf异常
问题描述
txt文件写入字符串是没问题的,换成pdf,写入二进制数据就不行了,异常里是null,有大佬知道如何解决吗?
代码片段
if (res && res.data instanceof ArrayBuffer) {
console.log('获取到的二进制数据:', res.data);
const fileName = 'downloadedFile.pdf';
const filePath = `_doc/${fileName}`;
plus.android.requestPermissions(
['android.permission.WRITE_EXTERNAL_STORAGE'],
(result) => {
console.log('存储权限请求结果:', result);
if (result.granted) {
plus.io.resolveLocalFileSystemURL('_doc/', (entry) => {
console.log('目录入口:', entry);
entry.getFile(fileName, {
create: true
}, (fileEntry) => {
console.log('获取到的文件条目:', fileEntry);
console.log('fileEntry 名称:', fileEntry.name);
console.log('fileEntry 路径:', fileEntry.fullPath);
console.log('是否为文件:', fileEntry.isFile);
console.log('是否为目录:', fileEntry.isDirectory);
fileEntry.createWriter(
(writer) => {
console.log('Writer 创建成功:', writer);
writer.onerror = (err) => {
console.error('文件写入失败:', err);
};
writer.onwriteend = () => {
console.log('写入操作已完成');
};
const binaryData = new Uint8Array(res.data);
try {
console.log('开始写入内容...');
writer.write(binaryData);
} catch (e) {
console.error('写入异常:', e);
}
writer.onwrite = () => {
console.log('文件写入成功:', fileEntry.fileName);
const localFilePath = plus.io.convertLocalFileSystemURL(fileEntry.fullPath);
console.log('本地文件路径:', localFilePath);
uni.openDocument({
filePath: localFilePath,
showMenu: true,
success: function() {
console.log('打开文档成功');
},
fail: function(err) {
console.error('打开文档失败:', err);
},
});
};
},
(error) => {
console.error('创建 Writer 失败:', error);
}
);
});
});
} else {
console.error('存储权限请求失败');
this.$showToast('权限请求失败');
}
},
(err) => {
console.error('存储权限请求失败:', err);
this.$showToast('权限请求失败');
}
);
} else {
console.error('未获取到有效的二进制数据');
this.$showToast('文件下载失败');
}
相关信息
信息 | 描述 |
---|---|
无 | 无 |
1 回复
在uni-app中处理PDF写入操作时,如果遇到writer.write()
方法异常,通常是由于几个常见原因导致的,比如文件路径问题、权限问题、数据格式问题等。以下是一个基本的代码示例,用于展示如何在uni-app中写入PDF文件,并包含一些异常处理的逻辑。请注意,uni-app本身不直接支持PDF操作,通常需要借助第三方库或者平台特有的API,这里以plus.io
(仅适用于5+ App)为例。
// 引入必要的模块
const fs = plus.io.FileSystem;
const path = '_www/'; // 文件存储路径,这里使用应用私有目录的www子目录
const fileName = 'example.pdf'; // 文件名
// 创建目标文件对象
const targetFile = fs.createFile(path + fileName, true);
// 定义写入数据(示例中为简单的文本,实际应用中可能是二进制数据)
const pdfContent = 'This is a sample PDF content.';
// 使用FileWriter进行写入操作
const writer = fs.createWriter(targetFile);
writer.onwrite = function(e) {
console.log('File written successfully.');
// 此处可以添加代码以打开或分享文件
};
writer.onerror = function(e) {
console.error('Error writing file:', e.message);
// 错误处理,可能的原因包括权限不足、磁盘空间不足等
};
// 开始写入操作
writer.write(pdfContent);
// 注意:上述代码仅适用于5+ App环境,对于H5、小程序等平台不适用
// 对于其他平台,可能需要使用对应的平台API或引入第三方库(如jspdf等)
// 示例:如果使用jspdf在H5环境中生成PDF(注意:jspdf不直接处理文件写入,需结合Blob和a标签下载)
// if (process.env.PLATFORM === 'h5') {
// const jsPDF = require('jspdf');
// const doc = new jsPDF();
// doc.text('Hello world!', 10, 10);
// const pdfData = doc.output('arraybuffer');
// const blob = new Blob([pdfData], { type: 'application/pdf' });
// const link = document.createElement('a');
// link.href = URL.createObjectURL(blob);
// link.download = 'example.pdf';
// link.click();
// }
// 注意:上述jspdf示例仅用于H5环境演示,实际项目中需根据平台差异进行适配
在实际开发中,遇到writer.write()
异常时,首先应检查文件路径是否正确、应用是否有足够的权限写入文件、以及写入的数据格式是否符合要求。此外,确保在正确的平台环境下执行相应的代码逻辑。