详解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 相关文章推荐
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
Dec 06 Javascript
又一个小巧的图片预加载类
May 05 Javascript
13个PHP函数超实用
Oct 21 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
深入理解基于vue-cli的vuex配置
Jul 24 Javascript
vue实现图书管理demo详解
Oct 17 Javascript
在Vue中使用echarts的方法
Feb 05 Javascript
vue全局组件与局部组件使用方法详解
Mar 29 Javascript
微信小程序之自定义组件的实现代码(附源码)
Aug 02 Javascript
vue-cli 3.x 修改dist路径的方法
Sep 19 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
Nov 24 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执行定时任务的实现思路
2015/12/21 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
Vue中props的详解
2019/05/16 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
简单学习Python time模块
2016/04/29 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
python3中编码获取网页的实例方法
2020/11/16 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
食品业务员岗位职责
2014/03/18 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
村安全生产责任书
2014/08/25 职场文书
故宫英文导游词
2015/01/31 职场文书
家庭经济困难证明
2015/06/23 职场文书
windows安装python超详细图文教程
2021/05/21 Python