详解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 组合form元素为json格式,asp.net反序列化
Jul 09 Javascript
js 实现打印网页中定义的部分内容的代码
Apr 01 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
Feb 26 Javascript
一个简单的Node.js异步操作管理器分享
Apr 29 Javascript
jQuery 中国省市两级联动选择附图
May 14 Javascript
Jquery元素追加和删除的实现方法
May 24 Javascript
Javascript调试之console对象——你不知道的一些小技巧
Jul 10 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 Javascript
JS实现求5的阶乘示例
Jan 21 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
详解JS函数防抖
Jun 05 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下过滤HTML代码的函数
2007/12/10 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
Python requests获取网页常用方法解析
2020/02/20 Python
django有哪些好处和优点
2020/09/01 Python
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
人民调解员培训方案
2014/06/05 职场文书
经典禁毒标语
2014/06/16 职场文书
社团活动总结书
2014/06/27 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
python Tkinter模块使用方法详解
2022/04/07 Python