React Native 文件下载权限配置与 Android 接口验证解决方案

作者:北岛

时间:2026-10-22

浏览:504

本文详细介绍 React Native 中 react-native-fs 插件的安装、Android 读写权限配置及文件下载功能实现。重点解决 Android 平台下载文件时因接口需要验证信息而报错的问题,通过手动传递 Cookie 到 headers 中实现跨平台兼容,确保图片等文件能正确下载并显示。

文章目录

React Native 文件下载与权限配置

react-native-fs 插件主要用于处理文件的上传与下载操作,支持 iOS 和 Android 双平台,其中文件上传功能仅支持 iOS 端。

安装命令如下:


npm install react-native-fs --save
//注意:如果react native版本是<0.40安装,使用此标签:
npm install react-native-fs@2.0.1-rc.2 --save 

安装完成后,需执行以下命令进行链接:


react-native link react-native-fs 

在 android/app/src/main/AndroidManifest.xml 文件中,添加 Android 读写文件的权限配置。


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  

完成上述安装步骤后,即可使用该插件提供的各类方法。具体每个方法的详细使用示例,请参考官方链接:https://github.com/itinance/react-native-fs。在本项目中,需要实现下载图片文件并获取本地路径以显示图片的功能,因此使用了 downloadFile 方法。为此封装了一个可调用的服务,代码如下:


downloadFile(imageId, cookie, callback) {

    const downloadDest = `${RNFS.DocumentDirectoryPath}/${((Math.random() * 1000) | 0)}.jpg`;

    var formUrl = CommonSvc.baseURL + '/api/image/0/' + imageId;

    //var formUrl = 'http://lorempixel.com/400/200/';

    const options = {

      fromUrl: formUrl,

      toFile: downloadDest,

      background: true,

      headers: {

        'Cookie': cookie //需要添加验证到接口要设置cookie

      },

      begin: (res) => {

        //console.log(res);

      },

      progress: (res) => {

        //console.log(res);

      }

    };

    try {

      const ret = RNFS.downloadFile(options);

      ret.promise.then(res => {

        //callback(null, Platform.OS === 'android' ? downloadDest : 'file://' + downloadDest)

        callback(null, 'file://' + downloadDest)

 

      }).catch(err => {

        callback(err)

      });

    }

    catch (e) {

      callback("error")

    }

 

  }, 

Android 接口验证问题与解决方案

在实现该功能时,发现 Android 端下载的图片无法显示。经查阅相关资料,原因是 Android 调用此插件时,若接口需要验证信息,必须手动添加接口验证信息。那么如何解决这个问题呢?

调用 react-native-fs 插件时,如果数据接口需要验证信息,在 Android 上运行会报错,而在 iOS 上运行正常。这是因为接口存在验证信息,而调用插件时未传入。iOS 会自动添加验证信息,而 Android 需要手动设置。

React Native 文件下载与权限配置

此错误的解决方法如下:

1. 在调用登录接口时,保存 Cookie(Cookie 位于 response 中),在调用 react-native-fs 时将 Cookie 放入 headers 中传入,代码如下:


_appLogin(userName, password, callback){

 

    fetch(commonSvc.baseURL + '/account/app-login', {

      method: 'POST',

      headers: {

        'Accept': 'application/json',

        'Content-Type': 'application/json'

      },

      body: JSON.stringify({

        UserName: userName,

        Password: password

      })

    }).then(

      (response) => {

        if (response.ok) {

          return response;

        } else {

          var message;

          switch (response.status) {

            case 710:

              message = LanguageChooseSvc.strings['api_common_' + 710];

              break;

            case 711:

              message = LanguageChooseSvc.strings['api_common_' + 711];

              break;

            case 400:

              message = LanguageChooseSvc.strings['api_common_' + 400];

              break;

            default:

              message = commonSvc.httpErrorMessage;

              break;

          }

          throw {message: message};

        }

      }

    ).then(

      (responseJson) => {

        callback(null, responseJson);

      }

    ).catch(

      (error) => {

        callback(error.message);

      }

    );

  }, 

2. 在调用 react-native-fs 时,将 Cookie 放入 headers 中传入,代码如下:


 downloadFile(imageId, cookie, callback) {

    const downloadDest = `${RNFS.DocumentDirectoryPath}/${((Math.random() * 1000) | 0)}.jpg`;

    var formUrl = CommonSvc.baseURL + '/api/image/0/' + imageId;

    //var formUrl = 'http://lorempixel.com/400/200/';

    const options = {

      fromUrl: formUrl,

      toFile: downloadDest,

      background: true,

      headers: {

        'Cookie': cookie //需要添加验证到接口要设置cookie

      },

      begin: (res) => {

        //console.log(res);

      },

      progress: (res) => {

        //console.log(res);

      }

    };

    try {

      const ret = RNFS.downloadFile(options);

      ret.promise.then(res => {

        //callback(null, Platform.OS === 'android' ? downloadDest : 'file://' + downloadDest)

        callback(null, 'file://' + downloadDest)

 

      }).catch(err => {

        callback(err)

      });

    }

    catch (e) {

      callback("error")

    }

 

  }, 

接下来,当项目编写到上传文件的功能时,将继续补充上传功能的实现...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章