下载文件(使用EXPO)—为什么这么难?

时间:2018-07-16 00:20:42

标签: react-native download

我一直在尝试以多种方式将文件下载到本地存储中以响应本机,但没有一种有效。这是我在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);

我收到此错误:

enter image description here

我是本机和JavaScript的新手,但是为什么仅仅下载文件似乎如此困难,有帮助吗?

6 个答案:

答案 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内写它