Expo React Native,将 PDF 文件保存到下载文件夹

问题描述 投票:0回答:2

以下代码适用于图像文件。但是,当我尝试保存 PDF 文件或其他非媒体格式时,出现“无法创建资产”错误。 据我了解,expo-media-library
旨在处理媒体格式文件。 expo-media-library 有什么替代方法来保存其他文件格式吗? import * as FileSystem from 'expo-file-system' import * as Permissions from 'expo-permissions' import * as MediaLibrary from 'expo-media-library' const downloadFile = async (uri: string) => { const targetUri = FileSystem.documentDirectory + getFileName(uri) const downloadedFile = await FileSystem.downloadAsync(uri, targetUri) if (downloadedFile.status === 200) { if (Platform.OS === 'android') { const permission = await Permissions.askAsync(Permissions.MEDIA_LIBRARY) if (permission.status !== 'granted') { return } const asset = await MediaLibrary.createAssetAsync(downloadedFile.uri) const album = await MediaLibrary.getAlbumAsync('Download') await MediaLibrary.addAssetsToAlbumAsync([asset], album, false) } } }

	
android react-native expo
2个回答
5
投票
https://docs.expo.dev/versions/latest/sdk/filesystem/#storageaccessframeworkcreatefileasyncparenturi-string-filename-string-mimetype-string

import * as FileSystem from 'expo-file-system'; import { StorageAccessFramework } from 'expo-file-system'; const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(); if (!permissions.granted) { return; } try { await StorageAccessFramework.createFileAsync(permissions.directoryUri, fileName, 'application/pdf') .then((r) => { console.log(r); }) .catch((e) => { console.log(e); }); } catch((e) => { console.log(e); });

我的pdf已下载完毕!

就我而言,我必须从 Base64 字符串生成文件。 我的代码:

import * as FileSystem from 'expo-file-system'; import { StorageAccessFramework } from 'expo-file-system'; const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(); if (!permissions.granted) { return; } const base64Data = 'my base 64 data'; try { await StorageAccessFramework.createFileAsync(permissions.directoryUri, fileName, 'application/pdf') .then(async(uri) => { await FileSystem.writeAsStringAsync(uri, base64Data, { encoding: FileSystem.EncodingType.Base64 }); }) .catch((e) => { console.log(e); }); } catch (e) { throw new Error(e); }



0
投票

保存/获取存储路径的代码:

const savePermissionGrantedFolderURI = async (uri: string) => { await AsyncStorage.setItem("granted-permission-folder", uri); }; export const getPermissionGrantedFolderURI = async () => { return await AsyncStorage.getItem("granted-permission-folder"); };

检查并获取授予文件夹 uri 权限的代码:

const checkAndGetPermissionGrantedFolderURI = async() => { // get the uri if the permission is already granted const uri = await getPermissionGrantedFolderURI(); if (uri) { // find if the uri is still valid try { const fileInfo = await FileSystem.StorageAccessFramework.readDirectoryAsync(uri); if (Array.isArray(fileInfo)) { return uri; } } catch (error) { // if not found or invalid, get the permission again by continuing } } // if not found or invalid, get the permission again const permissions = await FileSystem.StorageAccessFramework.requestDirectoryPermissionsAsync(); if (permissions.granted) { // save the permission granted folder uri and return the uri await savePermissionGrantedFolderURI(permissions.directoryUri); return permissions.directoryUri; } // if permission is not granted return null; };

检查平台并写入文件(如果是 android)的代码:

const saveFileToDevice = async( uri: string, // or base64 filename: string, mimetype: string ) => { if (Platform.OS === "android") { const permissionGrantedURI = await checkAndGetPermissionGrantedFolderURI(); if (!permissionGrantedURI) return; // if you have base64 already skip this step const base64 = await FileSystem.readAsStringAsync(uri, { encoding: FileSystem.EncodingType.Base64, }); const fileOnDeviceURI = await FileSystem.StorageAccessFramework.createFileAsync( permissionGrantedURI, filename, mimetype ); await FileSystem.writeAsStringAsync(fileOnDeviceURI, base64, { encoding: FileSystem.EncodingType.Base64, }); // if the file is saved successfully, return true return true; } await shareAsync(uri); };

	
© www.soinside.com 2019 - 2024. All rights reserved.