2017-03-03 1 views
1

J'utilise react-native-fetch-blob pour télécharger des fichiers mp3, puis les lire plus tard. Le problème est que le chemin réel pour RNFetchBlob.fs.dirs.DocumentDir change lorsque je ferme l'application et redémarre à nouveau, ce qui signifie que je ne peux pas utiliser le chemin d'accès absolu que j'ai stocké après avoir téléchargé les fichiers récupérer les fichiers lors de la prochaine exécution de l'application.Comment télécharger et récupérer des fichiers locaux sur iOS avec react native et react-native-fetch-blob?

Voici mon code pour le téléchargement et le stockage des chemins de fichiers:

export function downloadAudio(urlArray) { //download every section in the urlArray 
    return (dispatch) => { 
    Promise.all(urlArray.map(section => { 
     dispatch(startDownload(section.section_id)) 
     console.log('download start for id = ',section.section_id) //start download 
     return RNFetchBlob 
     .config({ 
     path: RNFetchBlob.fs.dirs.DocumentDir + '/courseSections/' + section.section_id + '.mp3', 
     appendExt: 'mp3' 
     }) 
     .fetch('GET', section.section_url, { 
     'Cache-Control': 'no-store' 
     }) 
     .progress({ count: 10 }, (received, total) => { 
     console.log(`progress for section ${section.section_id}: `, Math.floor(received/total*100), '%') 
     dispatch(downloadProgress({id: section.section_id, progress: Math.floor(received/total*100)/100})) 
     }) 
     .then(res => { 
     console.log(`section ${section.section_id} is saved to: `, res.path()) 
     return { path: res.path(), id: section.section_id } 
     }) 
     .then(pathInfo => dispatch(downloadSuccess(pathInfo))) //download finished 
    })) 
     .catch((error, statusCode) => { 
     console.log(statusCode, ' error: ', error) 
     }) 
    } 
} 

J'emmagasinés { path: res.path(), id: section.section_id } dans le cadre de l'état d'application persistait. Mais ce n'est pas utile parce que la prochaine fois que j'ouvre l'application, le chemin du fichier a été réaffecté. Par exemple, voici le chemin d'un fichier a été téléchargé sur: downloaded file path

Mais après je ferme l'application et le redémarrage, le chemin est changé: /Users/NatashaChe/Library/Developer/CoreSimulator/Devices/830778DE-3CE3-4FC7-AA4B-DFBAE999751C/data/Containers/Data/Application/0C47E33F-ACF8-4539-9456-8FF3E8FBECB2/Documents/courseSections/14.mp3

-à-dire les fichiers ont été assignés à un sous-dossier différent sous le dossier Application.

Il est évident que le lecteur audio (j'utilise le son natif de réaction) ne peut pas trouver le fichier en utilisant le chemin d'origine que l'application a stocké. Donc ma question est: Y a-t-il un moyen de réparer le chemin? Ou existe-t-il un autre moyen de récupérer des fichiers que je ne connais pas?

Et aussi, j'utilise le simulateur iOS sur mon ordinateur. Je n'ai pas encore essayé ça au téléphone. Est-ce que quelqu'un sait si le code ci-dessus peut être directement utilisé sur iphone et avoir le fichier enregistré dans le répertoire de mon application? Ou dois-je définir le chemin du fichier d'une autre manière? J'utilise reac native 0.41.

Répondre

2

J'ai fait le changement suivant pour le faire fonctionner, au moins sur le simulateur pour le moment. Je ne sais pas ce qui se passerait sur un téléphone réel.

Lors de la récupération du fichier, au lieu d'utiliser le chemin de fichier tel que renvoyé par res.path() comme dans le code ci-dessus, j'utilise maintenant directement filePath = RNFetchBlob.fs.dirs.DocumentDir + '/courseSections/' + sectionInfo.section.section_id + '.mp3' lors de la récupération du fichier.