React Native save base64 image to album

Goal

Save a base64 encode image to User album,
User can open album app and see that image.

Working Code

(test under Android phone, work for me)
using React Native 0.51

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 + "/haha.png"
      // Test under 'Samsung Galaxy Note 5'
      // console.log(dirs.DocumentDir) // /data/user/0/com.bigjpg/files
      // console.log(dirs.CacheDir)    // /data/user/0/com.bigjpg/cache
      // console.log(dirs.DCIMDir)     // /storage/emulated/0/DCIM
      // console.log(dirs.DownloadDir) // /storage/emulated/0/Download
      // console.log(dirs.PictureDir)  // /storage/emulated/0/Pictures
      
      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));
      });
      

Explain

react-native-fetch-blob is for file path
react-native-fs is for save file
json.qr is base64 encode image data string: data:image/png;base64,iVrm..etc

I actually submit a Stackoverflow question
https://stackoverflow.com/questions/48134397/react-native-save-base64-image-to-album

Last

Any question you can contact me at: guokrfans#gmail.com


in case you want see full code, here it is:

Full Code

import React, { Component } from 'react';
import { View, StyleSheet, Button, AsyncStorage, FlatList, Text, Image } from 'react-native';
import I18n from '../i18n/i18n';
import API from './API';
import BigjpgStore from './BigjpgStore.js';

import fetch_blob from 'react-native-fetch-blob';
import RNFS from 'react-native-fs';

export default class QRScreen extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      list: [{ key: 'a' }, { key: 'b' }],
      img_url: '',
      img_base64: '',
    };
  }
  getQR(){
    var params = {
      goods: 'std',
    };
    var esc = encodeURIComponent;
    var query = Object.keys(params)
      .map(k => esc(k) + '=' + esc(params[k]))
      .join('&');

    var api = API.youzan_order;
    var url = api + '?' + query;
    fetch(url, {
      method: 'GET',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'Cookie': BigjpgStore.cookie
      },
    })
    .then((res) => {
      return res.json()
    }).then((json) => {
      this.setState({
        img_url: json.qr_url,
        img_base64: json.qr,
      })
      const fs = fetch_blob.fs
      const dirs = fetch_blob.fs.dirs 
      const file_path = dirs.DCIMDir + "/bigjpg.png"
      // Test under 'Samsung Galaxy Note 5'
      // console.log(dirs.DocumentDir) // /data/user/0/com.bigjpg/files
      // console.log(dirs.CacheDir)    // /data/user/0/com.bigjpg/cache
      // console.log(dirs.DCIMDir)     // /storage/emulated/0/DCIM
      // console.log(dirs.DownloadDir) // /storage/emulated/0/Download
      // console.log(dirs.PictureDir)  // /storage/emulated/0/Pictures
      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));
      });

    }).catch((error) => {
      alert(JSON.stringify(error));
    });
  }
  render() {
    return (
      <View>
        <View>
          {this.state.img_base64 != '' &&
          <Image
            style={{ width: 150, height: 150 }}
            source={{ uri: this.state.img_base64 }}
            />
          }
          <View style={{ marginBottom: 80 }}>
          <Button onPress={() => { this.getQR() }} title='Get QR'></Button>
          </View>
        </View>
      </View>
    );
  }
}

you can't just copy&paste to make it work.
there are some code you don't have
like

import I18n from '../i18n/i18n';
import API from './API';
import BigjpgStore from './BigjpgStore.js';

I still post these out anyway, hope it help.