以下代码适用于 Android 10,它在 DCIM 文件夹中创建一个
csv
文件:
import * as FileSystem from 'expo-file-system';
import * as MediaLibrary from 'expo-media-library';
export async function saveCSV() {
const permission = await MediaLibrary.requestPermissionsAsync();
if (permission.status != 'granted') {
console.log("Permission not Granted!")
return;
}
// CSVLocation
const directoryUri = FileSystem.documentDirectory;
const fileUri = directoryUri + `formData.csv`;
// Save to DCIM folder
const asset = await MediaLibrary.createAssetAsync(fileUri);
try {
const album = await MediaLibrary.getAlbumAsync('album');
if (album == null) {
console.log("ASSET", asset)
await MediaLibrary.createAlbumAsync('album', asset, true);
} else {
await MediaLibrary.addAssetsToAlbumAsync([asset], album, true)
.then(() => {
console.log('File Saved Successfully!');
})
.catch((err: string) => {
console.log('Error In Saving File!', err);
});
}
} catch (e) {
console.log(e);
}
}
之前这行代码是在另一个函数中执行的,在上面用到的
fileUri
中创建了一个文件:
await FileSystem.writeAsStringAsync(fileUri, CSVheader + newInfo);
这里描述了这个问题:https://github.com/expo/expo/issues/12060
简而言之:Expo Media 库能够保存图像/视频/音频资产,因此它会因其他文件类型而失败。奇怪的是,它在
.pdf
和 .csv
上运行良好,直到 Android 10.
在上面的链接中,在 stackoverflow 上也有使用
StorageAccessFramework
的解决方案。但是,每次需要保存文件时,用户都需要在 Downloads 中创建一个子目录。我想在没有任何弹出窗口的情况下自动生成它(在获得许可后)。
目标文件夹并不重要,只要用户以后可以访问它即可。
MediaLibrary 仅适用于媒体文件(.mp4、.mp3、.jpg),因此无法创建 .pdf 或 .csv 文件扩展名。更多信息在这里。但是,它仍然可以使用媒体文件扩展名创建内容为 .pdf 或 .csv 的文件。 在下面的代码中,
asset
指向一个包含逗号分隔值字符串的文件。
import * as FileSystem from 'expo-file-system';
import * as MediaLibrary from 'expo-media-library';
export async function saveCSV() {
const permission = await MediaLibrary.requestPermissionsAsync();
if (permission.status != 'granted') {
console.log("Permission not Granted!")
return;
}
// CSVLocation
const directoryUri = FileSystem.documentDirectory;
const fileUri = directoryUri + `formData.mp4`;
// Save to DCIM folder
const asset = await MediaLibrary.createAssetAsync(fileUri);
try {
const album = await MediaLibrary.getAlbumAsync('forms');
if (album == null) {
await MediaLibrary.createAlbumAsync('forms', asset, true);
} else {
await MediaLibrary.addAssetsToAlbumAsync([asset], album, true)
.then(() => {
console.log('File Saved Successfully!');
})
.catch((err: string) => {
console.log('Error In Saving File!', err);
});
}
} catch (e) {
console.log(e);
}
}
这将生成一个以逗号分隔值 (CSV) 和 .mp4 扩展名的文件。
此文件旨在供 Windows 用户导出和使用。他们将使用以下
.bat
脚本重命名它们:
@ECHO OFF
rename *.mp4 *.csv
重命名后,它们将成为功能齐全的 csv 文件。同样的过程将适用于 .pdf 或其他不受 ExpoMediaLibrary 支持的文件扩展名