react-native-fs插件是文件对上传和下载时使用的,iOS和android都可使用,File upload (iOS only)。 安装命令: npm install react-n...

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读写文件的权限

  
 
 

downloadFile(imageId, cookie, callback) {    const downloadDest = `${RNFS.DocumentDirectoryPath}/${((Math.random() * 1000) | 0)}.jpg`;    var formUrl = CommonSvc.baseURL + '/api/image/0/' + imageId;    //var formUrl = 'https://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 = 'https://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")    }   }, 

接下来项目写到上传文件的功能时,继续补充上传功能...