您好,登錄后才能下訂單哦!
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") } },
接下來項目寫到上傳文件的功能時,繼續補充上傳功能...
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。