以下代码适用于图像文件。但是,当我尝试保存 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)
}
}
}
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);
}
保存/获取存储路径的代码:
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);
};