Вот код, который я ввел после нескольких поисков. :
Код: Выделить всё
import * as FileSystem from "expo-file-system";
import { shareAsync } from "expo-sharing";
import { Platform } from "react-native";
export async function saveFile (data, fileName, type) {
try {
const fr = new FileReader();
fr.onload = async () => {
const fileUri = `${FileSystem.documentDirectory}/file.${type}`;
await FileSystem.writeAsStringAsync(fileUri, fr.result.split(',')[1], {encoding: FileSystem.EncodingType.Base64});
saveToFolder(fileUri, fileName, 'application/pdf');
};
fr.readAsDataURL(data);
} catch (e) {
console.log(e);
}
};
async function saveToFolder(uri, filename, mimetype) {
if (Platform.OS === "android") {
const permissions = await FileSystem.StorageAccessFramework.requestDirectoryPermissionsAsync();
if (permissions.granted) {
const base64 = await FileSystem.readAsStringAsync(uri, { encoding: FileSystem.EncodingType.Base64 });
await FileSystem.StorageAccessFramework.createFileAsync(permissions.directoryUri, filename, mimetype)
.then(async (uri) => {
await FileSystem.writeAsStringAsync(uri, base64, { encoding: FileSystem.EncodingType.Base64 });
})
.catch(e => console.log(e));
} else {
shareAsync(uri);
}
} else {
shareAsync(uri);
}
};
Это вызывает несколько проблем:
- Отказано в разрешении для папки «Загрузка», поэтому необходимо создать новую папку для сохранения файлов.
- Ошибка с надписью «Невозможно подключиться к Metro...» после сохранения файл.
UPD: ошибка «Невозможно подключиться к Metro...» появляется только в том случае, если я в меню сохранения файлов перехожу к другой папке, отличной от той, которая создана для приложения.
UPD 2: Кажется, что разрешения фактически предоставлены, но только для вновь созданной папки, т. е. для текущего использования приложения. Если я попытаюсь использовать любую другую папку, я не смогу получить разрешение, а также получу указанную выше ошибку.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -with-expo
Мобильная версия