中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解react-native-fs插件的使用以及遇到的坑

發布時間:2020-08-20 11:55:53 來源:腳本之家 閱讀:679 作者:xiaojun_zxj 欄目:web開發

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

    }

 

  }, 

接下來項目寫到上傳文件的功能時,繼續補充上傳功能...

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正宁县| 津南区| 乐昌市| 交城县| 兴隆县| 英吉沙县| 云阳县| 张家港市| 吉木乃县| 璧山县| 冀州市| 孝昌县| 鹤庆县| 厦门市| 林周县| 浑源县| 兴化市| 大田县| 德保县| 天全县| 内江市| 刚察县| 柯坪县| 景东| 三台县| 永川市| 百色市| 浦城县| 论坛| 临夏县| 繁昌县| 吉木萨尔县| 长宁县| 手游| 平舆县| 明星| 福州市| 玛多县| 昌黎县| 宜都市| 石棉县|