我一直在尝试以多种方式将文件下载到本地存储中以响应本机,但没有一种有效。这是我在App.js中的代码,我在其中调用FileSystem.downloadAsync。
import React from 'react';
import { AppRegistry, StyleSheet, Text, View, TouchableHighlight, Image, Linking, PixelRatio, ListView } from 'react-native';
import { createStackNavigator } from 'react-navigation'
import MainScreen from './Components/MainScreen'
import FileSystem from 'react-native-filesystem';
export default class App extends React.Component {
render() {
return (
FileSystem.downloadAsync(
'http://techslides.com/demos/sample-videos/small.mp4',
FileSystem.documentDirectory + 'small.mp4'
)
.then(({ uri }) => {
console.log('Finished downloading to ', uri);
})
.catch(error => {
console.error(error);
}),
<AppStackNavigator />
);
}
}
const AppStackNavigator = createStackNavigator({
Main:{
screen: MainScreen
}
})
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});
AppRegistry.registerComponent('Recap', () => App);
我收到此错误:
我是本机和JavaScript的新手,但是为什么仅仅下载文件似乎如此困难,有帮助吗?
答案 0 :(得分:1)
替换您的
import FileSystem from 'react-native-filesystem';
作者
import { FileSystem } from 'expo';
答案 1 :(得分:0)
因此,从外观上看,似乎尚未像很多人要求的那样将上述功能开发为Expo的功能-
https://expo.canny.io/feature-requests/p/ability-to-save-files-on-internal-storage
答案 2 :(得分:0)
有一个解决方案!这不是一个很好的解决方案,它是一个完全的hack,但是我刚刚对其进行了测试,并且不需要任何额外的程序包或权限也可以很好地工作。它适用于任何文件。
import { CameraRoll } from 'react-native';
...
CameraRoll.saveToCameraRoll( fileURI, 'photo');
这会将文件移至DCIM根目录。这意味着可以通过USB或文件浏览器进行访问。这是一个直接的黑客,可能是有人在不检查模仿类型的情况下进行监督,但是可以正常工作!
答案 3 :(得分:0)
我尚未在ios上测试过此功能,但它在Android上完美运行,将文件保存到下载目录:
import * as MediaLibrary from 'expo-media-library';
import * as FileSystem from 'expo-file-system';
import * as Permissions from 'expo-permissions';
downloadFile(){
const uri = "http://techslides.com/demos/sample-videos/small.mp4"
let fileUri = FileSystem.documentDirectory + "small.mp4";
FileSystem.downloadAsync(uri, fileUri)
.then(({ uri }) => {
this.saveFile(uri);
})
.catch(error => {
console.error(error);
})
}
saveFile = async (fileUri: string) => {
const { status } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
if (status === "granted") {
const asset = await MediaLibrary.createAssetAsync(fileUri)
await MediaLibrary.createAlbumAsync("Download", asset, false)
}
}
答案 4 :(得分:0)
我能够在sdk-38世博会中下载所有类型的文件,这一点都不困难,只有一个问题, 您将需要创建一个文件夹(如果需要,可以使用您的应用程序名称),然后下载该文件夹(或其子文件夹)中的所有文件,图像/视频将直接显示,以查看其他文件,您必须下载相关文件-探险家。 参见参考
downloadFile = async (url) =>{
let path = url.split('/');
const file_name = path[path.length-1];
FileSystem.downloadAsync(
url,
FileSystem.documentDirectory + file_name
)
.then(({ uri }) => {
console.log('Finished downloading to ', uri);
MediaLibrary.createAssetAsync(uri).then(asset => {
console.log('asset', asset);
MediaLibrary.createAlbumAsync('myfolder', asset)
.then(() => {
showMessage({
message: t('general.success'),
description: t('download.success'),
type: 'success'
});
})
.catch(error => {
showMessage({
message: t('general.success'),
description: t('download.failed'),
type: 'danger'
});
});
});
})
.catch(error => {
console.error(error);
});
}
请紧记,我已经通过HTTP URL下载文件(Xls,doc等),然后将其转换为本地URI(如果您已经具有本地URI)(可能来自expo-camera / expo-image-picker lib)。您应该使用第9行的上述代码 希望对别人有帮助
答案 5 :(得分:-1)
首先,您不应该在return内部编写FileSystem代码。它不会工作。您应该在render而不是return内写它