详解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 相关文章推荐
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
读jQuery之四(优雅的迭代)
Jun 20 Javascript
Js四则运算函数代码
Jul 21 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
JS替换字符串中空格方法
Apr 17 Javascript
jQuery时间轴插件使用详解
Jul 16 Javascript
JS实现含有中文字符串的友好截取功能分析
Mar 13 Javascript
详解Vue.use自定义自己的全局组件
Jun 14 Javascript
详解vue中computed 和 watch的异同
Jun 30 Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 Javascript
centos 上快速搭建ghost博客方法分享
May 23 Javascript
详解vue-flickity的fullScreen功能实现
Apr 07 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对字符串的递增运算分析
2010/08/08 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
python 显示数组全部元素的方法
2018/04/19 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
利用python修改json文件的value方法
2018/12/31 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
好家长事迹材料
2014/01/23 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
物业管理交接协议书
2016/03/24 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫