如何解决RN-fetch-blob错误的base64-仅限Android问题
我在react native中遇到问题,我要从API下载base 64字符串,然后在移动设备上将其呈现为PDF。
该项目使用React本机构建-代码在iOS上运行良好,但在Android上,我们收到了“错误的base 64” /无效的PDF格式错误。
代码:
//fetch on button click
getBill = () => {
if (Platform.OS === "android") {
this.getAndroidPermission();
} else {
this.downloadBill();
}
};
//check user has permissions on device (only for android)
getAndroidPermission = async () => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
);
const grantedRead = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE
);
if (
granted === PermissionsAndroid.RESULTS.GRANTED &&
grantedRead === PermissionsAndroid.RESULTS.GRANTED
) {
this.downloadBill();
} else {
Alert.alert(
"Permission Denied!","You need to give storage permission to download the file"
);
}
} catch (err) {
console.warn(err);
}
};
//download and display bill
downloadBill = async () => {
this.setState({ loading: true });
let billId = this.state.billId;
let user = await AsyncStorage.getItem("user");
let parseUser = JSON.parse(user);
let userToken = parseUser.token;
RNFetchBlob.config({
addAndroidDownloads: {
useDownloadManager: true,notification: true,path:
RNFetchBlob.fs.dirs.DownloadDir +
"/" +
`billID_${this.state.billId}.pdf`,mime: "application/pdf",description: "File downloaded by download manager.",appendExt: "pdf",trusty: true,},})
.fetch("GET",`${config.apiUrl}/crm/getbillfile/${billId}`,{
Authorization: "Bearer " + userToken,})
.then((resp) => {
let pdfLocation =
RNFetchBlob.fs.dirs.DocumentDir +
"/" +
`billID_${this.state.billId}.pdf`;
RNFetchBlob.fs.writeFile(pdfLocation,resp.data,"base64");
FileViewer.open(pdfLocation,{
ondismiss: () => this.setState({ loading: false }),});
});
};
Android清单:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
任何帮助将不胜感激
解决方法
您给出了在Android中打开错误的文件路径,而在IOS中,它实际上是保存在正确的位置并从正确的位置打开。
在打开文件之前检查操作系统,然后打开文件。
....
const fpath = `${RNFetchBlob.fs.dirs.DownloadDir}${filename}`;
RNFetchBlob.config({
addAndroidDownloads: {
useDownloadManager: true,notification: true,path: fpath,description: "File downloaded by download manager.",},})
.fetch("GET",`${config.apiUrl}/crm/getbillfile/${billId}`,{
Authorization: "Bearer " + userToken,})
.then((resp) => {
if (OS == "ios") {
// ... do existing logic
} else if (OS === "android") {
// FileViewer or RNFetchBlob should work.
RnFetchBlob.android.actionViewIntent(fpath,"application/pdf");
}
});
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。