首頁 >web前端 >js教程 >react-native-fs外掛程式使用案例詳解

react-native-fs外掛程式使用案例詳解

php中世界最好的语言
php中世界最好的语言原創
2018-04-18 09:09:352260瀏覽

這次帶給大家react-native-fs外掛程式使用案列詳解,react-native-fs外掛程式使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

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需要手動設定。

此錯誤的解決方法:

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")
    }
 
  },

#相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

js實作字元限製中文漢字=兩個字元

用js實作汽車儀表板

以上是react-native-fs外掛程式使用案例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn