如何将 pdf 保存到 android 文件系统然后查看 PDF - react-native
How to save pdf to android file system and then view PDF - react-native
我正在使用 react-native-fs,我正在尝试将 pdf 文件的 base64 保存到我的 android 模拟器文件系统。
我从服务器接收到 base64 编码的 pdf。
然后我使用以下行解码 base64 字符串:
var pdfBase64 = 'data:application/pdf;base64,'+base64Str;
saveFile() 函数
saveFile(filename, pdfBase64){
// create a path you want to write to
var path = RNFS.DocumentDirectoryPath + '/' + filename;
// write the file
RNFS.writeFile(path, base64Image, 'base64').then((success) => {
console.log('FILE WRITTEN!');
})
.catch((err) => {
console.log("SaveFile()", err.message);
});
}
错误
当我尝试保存 pdfBase64 时,saveFile() 函数捕获以下错误:
bad base-64
问题
谁能告诉我哪里或哪里做错了?
谢谢。
对于遇到相同问题的任何人,这里是解决方案。
解决方案
react-native-pdf-view 一定要把文件路径取到pdf_base64。
首先,我使用 react-native-fetch-blob 从服务器请求 pdf base64。(因为 RN fetch API 还不支持 BLOB)。
我还发现 react-native-fetch-blob 也有一个文件系统 API,它比 'react-native-fs' 库有更好的记录和更容易理解。 (Check out its FileSystem API documentation)
接收base64 pdf并保存到文件路径:
var RNFetchBlob = require('react-native-fetch-blob').default;
const DocumentDir = RNFetchBlob.fs.dirs.DocumentDir;
getPdfFromServer: function(uri_attachment, filename_attachment) {
return new Promise((RESOLVE, REJECT) => {
// Fetch attachment
RNFetchBlob.fetch('GET', config.apiRoot+'/app/'+uri_attachment)
.then((res) => {
let base64Str = res.data;
let pdfLocation = DocumentDir + '/' + filename_attachment;
RNFetchBlob.fs.writeFile(pdfLocation, pdf_base64Str, 'base64');
RESOLVE(pdfLocation);
})
}).catch((error) => {
// error handling
console.log("Error", error)
});
}
我做错的是没有像我在上面的示例中那样将 pdf_base64Str 保存到文件位置。我是这样保存的:
var pdf_base64= 'data:application/pdf;base64,'+pdf_base64Str;
这是错误的。
使用文件路径填充 PDF 视图:
<PDFView
ref={(pdf)=>{this.pdfView = pdf;}}
src={pdfLocation}
style={styles.pdf}
/>
有一个新的包来处理抓取(基于react-native-fetch-blob) and displaying of the PDF via URL: react-native-pdf。
删除 base64 字符串中的应用程序类型,它对我有用
var pdfBase64 = 'data:application/pdf;base64,'+base64Str;
至
var pdfBase64 = base64Str;
我正在使用 react-native-fs,我正在尝试将 pdf 文件的 base64 保存到我的 android 模拟器文件系统。
我从服务器接收到 base64 编码的 pdf。
然后我使用以下行解码 base64 字符串:
var pdfBase64 = 'data:application/pdf;base64,'+base64Str;
saveFile() 函数
saveFile(filename, pdfBase64){
// create a path you want to write to
var path = RNFS.DocumentDirectoryPath + '/' + filename;
// write the file
RNFS.writeFile(path, base64Image, 'base64').then((success) => {
console.log('FILE WRITTEN!');
})
.catch((err) => {
console.log("SaveFile()", err.message);
});
}
错误
当我尝试保存 pdfBase64 时,saveFile() 函数捕获以下错误:
bad base-64
问题
谁能告诉我哪里或哪里做错了?
谢谢。
对于遇到相同问题的任何人,这里是解决方案。
解决方案
react-native-pdf-view 一定要把文件路径取到pdf_base64。
首先,我使用 react-native-fetch-blob 从服务器请求 pdf base64。(因为 RN fetch API 还不支持 BLOB)。
我还发现 react-native-fetch-blob 也有一个文件系统 API,它比 'react-native-fs' 库有更好的记录和更容易理解。 (Check out its FileSystem API documentation)
接收base64 pdf并保存到文件路径:
var RNFetchBlob = require('react-native-fetch-blob').default;
const DocumentDir = RNFetchBlob.fs.dirs.DocumentDir;
getPdfFromServer: function(uri_attachment, filename_attachment) {
return new Promise((RESOLVE, REJECT) => {
// Fetch attachment
RNFetchBlob.fetch('GET', config.apiRoot+'/app/'+uri_attachment)
.then((res) => {
let base64Str = res.data;
let pdfLocation = DocumentDir + '/' + filename_attachment;
RNFetchBlob.fs.writeFile(pdfLocation, pdf_base64Str, 'base64');
RESOLVE(pdfLocation);
})
}).catch((error) => {
// error handling
console.log("Error", error)
});
}
我做错的是没有像我在上面的示例中那样将 pdf_base64Str 保存到文件位置。我是这样保存的:
var pdf_base64= 'data:application/pdf;base64,'+pdf_base64Str;
这是错误的。
使用文件路径填充 PDF 视图:
<PDFView
ref={(pdf)=>{this.pdfView = pdf;}}
src={pdfLocation}
style={styles.pdf}
/>
有一个新的包来处理抓取(基于react-native-fetch-blob) and displaying of the PDF via URL: react-native-pdf。
删除 base64 字符串中的应用程序类型,它对我有用
var pdfBase64 = 'data:application/pdf;base64,'+base64Str;
至
var pdfBase64 = base64Str;