详解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 相关文章推荐
选择TreeView控件的树状数据节点的JS方法(jquery)
Feb 06 Javascript
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
Mar 25 Javascript
jQuery回车实现登录简单实现
Aug 20 Javascript
javascript操作数组详解
Dec 17 Javascript
angularjs客户端实现压缩图片文件并上传实例
Jul 06 Javascript
js为什么不能正确处理小数运算?
Dec 29 Javascript
理解javascript正则表达式
Mar 08 Javascript
jQuery实现的简单无刷新评论功能示例
Nov 08 jQuery
全面分析JavaScript 继承
May 30 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
Jul 13 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+MySql编写聊天室
2006/10/09 PHP
PHP 替换模板变量实现步骤
2009/08/24 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
Pandas中resample方法详解
2019/07/02 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
详解python程序中的多任务
2020/09/16 Python
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
技术总监岗位职责
2013/12/05 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
文化产业实施方案
2014/06/07 职场文书
学习十八大演讲稿
2014/09/15 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
期末个人总结范文
2015/02/13 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
Go语言特点及基本数据类型使用详解
2022/03/21 Golang