详解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 AnythingSlider滑动效果插件
Feb 07 Javascript
jQuery 处理网页内容的实现代码
Feb 15 Javascript
js导出txt示例代码
Jan 14 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
window.onload使用指南
Sep 13 Javascript
超详细的javascript数组方法汇总
Nov 21 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
学习AngularJs:Directive指令用法(完整版)
Apr 26 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
Sep 09 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数字格式化
2006/12/06 PHP
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php根据年月获取季度的方法
2014/03/31 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
驱动事件的addEvent.js代码
2007/03/27 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
Python中的多重装饰器
2015/04/11 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python生成lmdb格式的文件实例
2018/11/08 Python
django主动抛出403异常的方法详解
2019/01/04 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
最新pycharm安装教程
2020/11/18 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
列车长先进事迹材料
2014/01/25 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
幼儿园辞职书
2015/02/26 职场文书
高中信息技术教学反思
2016/02/16 职场文书
2019思想汇报范文
2019/05/21 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL