Les API tierces renvoient une "image de code QR" en base64,
J'ai besoin de sauvegarder cette image dans l'album de l'utilisateur.
le responsable de React-Native-Fetch-Blob ayant disparu, personne ne répondant à la question Github, createFile
de Document React-Native-Fetch-Blob ne fonctionnant pas comme prévu (sauvegarde de l'image dans l'album)
import fetch_blob from 'react-native-fetch-blob';
// json.qr variable are return from API
const fs = fetch_blob.fs
const base64 = fetch_blob.base64
const dirs = fetch_blob.fs.dirs
const file_path = dirs.DCIMDir + "/some.jpg"
const base64_img = base64.encode(json.qr)
fs.createFile(file_path, base64_img, 'base64')
.then((rep) => {
alert(JSON.stringify(rep));
})
.catch((error) => {
alert(JSON.stringify(error));
});
parce que je fetch
une API sans en-tête CORS,
Je ne peux pas le déboguer dans Debug JS Remotely
Chrome arrêterait cette demande,
Je dois l'exécuter sur mon téléphone Android pour que cela fonctionne
(pas de contrôle CORS sur le vrai téléphone)
Je planifie utiliser Clipboard enregistrer la chaîne base64,
et le coder en dur dans mon code,
pour déboguer ce qui ne va pas avec l'API react-native-fetch-blob
createFile
Je résous le problème,
J'ai oublié data:image/png;base64,
au début de la chaîne.
Je l'enlève avec le code suivant
// json.qr is base64 string
var image_data = json.qr.split('data:image/png;base64,');
image_data = image_data[1];
puis enregistrez le fichier image
import fetch_blob from 'react-native-fetch-blob';
import RNFS from 'react-native-fs';
const fs = fetch_blob.fs
const dirs = fetch_blob.fs.dirs
const file_path = dirs.DCIMDir + "/bigjpg.png"
// json.qr is base64 string "data:image/png;base64,..."
var image_data = json.qr.split('data:image/png;base64,');
image_data = image_data[1];
RNFS.writeFile(file_path, image_data, 'base64')
.catch((error) => {
alert(JSON.stringify(error));
});
Supprimer data:image/png;base64,
dans votre chaîne base64
var Base64Code = base64Image.split("data:image/png;base64,"); //base64Image is my image base64 string
const dirs = RNFetchBlob.fs.dirs;
var path = dirs.DCIMDir + "/image.png";
RNFetchBlob.fs.writeFile(path, Base64Code[1], 'base64')
.then((res) => {console.log("File : ", res)});
Et puis j'ai résolu mon problème.
const path = `${RNFS.PicturesDirectoryPath}/My Album`;
await RNFS.mkdir(path);
return await fetch(uri)
.then(res => res.blob())
.then(image => {
RNFetchBlob.fs.readFile(uri, "base64").then(data => {
RNFS.appendFile(`${path}/${image.data.name}`, data, "base64").catch(
err => {
console.log("error writing to Android storage :", err);
}
);
});
});