当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 详解react-native-fs插件的使用以及遇到的坑

详解react-native-fs插件的使用以及遇到的坑

2017年12月12日  | 移动技术网IT编程  | 我要评论
react-native-fs插件是文件对上传和下载时使用的,ios和android都可使用,file upload (ios only)。 安装命令: n

react-native-fs插件是文件对上传和下载时使用的,ios和android都可使用,file upload (ios only)。

安装命令:

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" />  

进行完上述安装操作后,可以使用这个插件的各种方法,每个方法的具体使用例子,请看链接:。在项目里我需要下载图片文件,并获得下载到本地后的图片路径,然后显示图片。所以使用到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调用此插件,需要添加接口验证信息(如果接口是需要验证的情况下),这个问题怎么解决呢

调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在ios上运行没问题。原因是因为接口是有验证信息的,而调用这个插件时没有传入,在ios上会自动加上验证信息,而 android需要手动设置。

此错误的解决方法:

1.在调用登录接口时,保存下cookie(cookie在response里),在调用react-native-fs时放在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时放在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")

    }

 

  }, 

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

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网