详解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 相关文章推荐
javascript 操作文件 实现方法小结
Jul 02 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
javascript预览上传图片发现的问题的解决方法
Nov 25 Javascript
jquery提交form表单简单示例分享
Mar 03 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
jQuery焦点图轮播效果实现方法
Dec 19 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
Apr 13 Javascript
浅谈es6中export和export default的作用及区别
Feb 07 Javascript
Angular 组件之间的交互的示例代码
Mar 24 Javascript
vue实现百度语音合成的实例讲解
Oct 14 Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 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/10/09 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
PHP学习之字符串比较和查找
2011/04/17 PHP
PHP二维数组的去重问题解析
2011/07/17 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
ES6 Generator基本使用方法示例
2020/06/06 Javascript
JavaScript中ES6规范中let和const的用法和区别
2020/08/06 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
python妹子图简单爬虫实例
2015/07/07 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
大学自荐信
2013/12/12 职场文书
业绩考核岗位职责
2014/02/01 职场文书
党员违纪检讨书
2014/02/18 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2015年收银工作总结范文
2015/04/01 职场文书