uni-app中writer.write()写入pdf异常

发布于 1周前 作者 nodeper 来自 Uni-App

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()异常时,首先应检查文件路径是否正确、应用是否有足够的权限写入文件、以及写入的数据格式是否符合要求。此外,确保在正确的平台环境下执行相应的代码逻辑。

回到顶部