如何在 React Native for Android 11(或更高版本)中以编程方式创建 .pdf 或 .csv 文件

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

以下代码适用于 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 中创建一个子目录。我想在没有任何弹出窗口的情况下自动生成它(在获得许可后)。 目标文件夹并不重要,只要用户以后可以访问它即可。

react-native expo
1个回答
0
投票

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 支持的文件扩展名

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