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


Posted in Javascript onSeptember 12, 2017

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

进行完上述安装操作后,可以使用这个插件的各种方法,每个方法的具体使用例子,请看链接: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调用此插件,需要添加接口验证信息(如果接口是需要验证的情况下),这个问题怎么解决呢

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

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

此错误的解决方法:

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

    }

 

  },

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

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

Javascript 相关文章推荐
对jQuery的事件绑定的一些思考(补充)
Apr 20 Javascript
Extjs单独定义各组件的实例代码
Jun 25 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
js实现同一页面多个运动效果的方法
Apr 10 Javascript
js仿小米手机上下滑动效果
Feb 05 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 Javascript
原生JavaScript实现Ajax异步请求
Nov 19 Javascript
小程序实现搜索框
Jun 19 Javascript
Vue.set 全局操作简单示例
Sep 19 Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 Javascript
vue $mount 和 el的区别说明
Sep 11 Javascript
k8s node节点重新加入master集群的实现
Feb 22 Javascript
React中jquery引用的实现方法
Sep 12 #jQuery
JS+canvas动态绘制饼图的方法示例
Sep 12 #Javascript
详解react-router4 异步加载路由两种方法
Sep 12 #Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 #Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 #Javascript
Angular 4.0学习教程之架构详解
Sep 12 #Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 #jQuery
You might like
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
python多进程并行代码实例
2019/09/30 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
酷瑞网络科技面试题
2012/03/30 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
中职应届生会计求职信
2013/10/23 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
2014年村委会工作总结
2014/11/24 职场文书
创建文明城市倡议书
2015/04/28 职场文书
律政俏佳人观后感
2015/06/09 职场文书
寒假致家长的一封信
2015/10/10 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸