我正在使用React Native为Android和iOS构建应用程序。我试图让用户在点击按钮时下载PDF文件。
android.permission.WRITE_EXTERNAL_STORAGE
。我仔细检查了我试图下载的文件是否存在(当它没有时,库会抛出错误)我没有找到解决此问题的其他解决方案。我找到了用于查看PDF的库,但我想让用户下载PDF。你能帮帮我吗?
答案 0 :(得分:25)
一小时前刚刚实施了下载功能:p
请按照以下步骤操作:
a)npm install rn-fetch-blob
b)按照安装说明进行操作。
b2)如果您想在不使用rnpm的情况下手动安装软件包,请转到他们的wiki。
c)最后,这就是我在应用程序中下载文件的方式:
const { config, fs } = RNFetchBlob
let PictureDir = fs.dirs.PictureDir // this is the pictures directory. You can check the available directories in the wiki.
let options = {
fileCache: true,
addAndroidDownloads : {
useDownloadManager : true, // setting it to true will use the device's native download manager and will be shown in the notification bar.
notification : false,
path: PictureDir + "/me_"+Math.floor(date.getTime() + date.getSeconds() / 2), // this is the path where your downloaded file will live in
description : 'Downloading image.'
}
}
config(options).fetch('GET', "http://www.example.com/example.pdf").then((res) => {
// do some magic here
})
答案 1 :(得分:6)
如果您正在使用博览会,react-native-fetch-blob
无法正常工作。使用FileSystem
。
这是一个有效的例子:
const { uri: localUri } = await FileSystem.downloadAsync(remoteUri, FileSystem.documentDirectory + 'name.ext');
现在您拥有localUri
,其中包含下载文件的路径。您可以自由设置自己的文件名,而不是name.ext
。
答案 2 :(得分:1)
我遵循了 Jonathan Simonney 的解决方案,在这篇文章的上面。但我不得不稍微改变一下:
const { config, fs } = RNFetchBlob;
const date = new Date();
const { DownloadDir } = fs.dirs; // You can check the available directories in the wiki.
const options = {
fileCache: true,
addAndroidDownloads: {
useDownloadManager: true, // true will use native manager and be shown on notification bar.
notification: true,
path: `${DownloadDir}/me_${Math.floor(date.getTime() + date.getSeconds() / 2)}.pdf`,
description: 'Downloading.',
},
};
config(options).fetch('GET', 'http://www.africau.edu/images/default/sample.pdf').then((res) => {
console.log('do some magic in here');
});
答案 3 :(得分:0)
我遇到了同样的问题,可以使用Expo WebBrowser Module来工作
// install module
npm install react-native-webview
// import the module
import * as WebBrowser from 'expo-web-browser';
// then in your function you can call this function
await WebBrowser.openBrowserAsync(file_ur);
它将打开文件的预览,然后用户可以使用“共享”按钮下载。