55

I'm building a react native app that needs to store images at base64 string format for offline viewing capabilities.

What library / function would give me the best result to store the image as base64 string? assuming my url is "http://www.example.com/image.png".

Also, do I need to make http request to get it before storing it as a string? my logic says yes, but in react native you can load images on the <Image> component without request them first from the server.

What would be the best option to do this in react native?

16 Answers 16

57

I use rn-fetch-blob, basically it provides lot of file system and network functions make transferring data pretty easy.

react-native-fetch-blob is deprecated

import RNFetchBlob from "rn-fetch-blob";
const fs = RNFetchBlob.fs;
let imagePath = null;
RNFetchBlob.config({
  fileCache: true
})
  .fetch("GET", "http://www.example.com/image.png")
  // the image is now dowloaded to device's storage
  .then(resp => {
    // the image path you can use it directly with Image component
    imagePath = resp.path();
    return resp.readFile("base64");
  })
  .then(base64Data => {
    // here's base64 encoded image
    console.log(base64Data);
    // remove the file from storage
    return fs.unlink(imagePath);
  });

source Project Wiki

Sign up to request clarification or add additional context in comments.

6 Comments

How to use local image like 'user/Project/example.png'?.
@Sathya Documentation provides such example with local files Here github.com/wkh237/react-native-fetch-blob/wiki/…
@OliverDixon so it is not good because it does not work for you ?
Actually, this code will crash the app, causing a FileUriExposedException
CocoaPods could not find compatible versions for pod "React/Core": In Podfile: react-native-fetch-blob (from ../node_modules/react-native-fetch-blob) was resolved to 0.10.6, which depends on
|
26

There is a better way: Install this react-native-fs, IF you don't already have it.

import RNFS from 'react-native-fs';

RNFS.readFile(this.state.imagePath, 'base64')
.then(res =>{
  console.log(res);
});

3 Comments

Works on RN 0.63.3
When I try to save into a variable, it saves as [object Object] instead of the base64 string. How to save the base64 string to a variable?
It says "At the command line, in your project folder, type: react-native link react-native-fs. Done! No need to worry about manually adding the library to your project."And then down it says Android usage and all that stuff ? Update the documentation plz
18

The standalone expo FileSystem package makes this simple:

const base64 = await FileSystem.readAsStringAsync(photo.uri, { encoding: 'base64' });

As 2019-09-27 this package handles both file:// and content:// uri's

1 Comment

above code is only for images not for pdf and other files.
13
 ImageEditor.cropImage(imageUrl, imageSize, (imageURI) => {
      ImageStore.getBase64ForTag(imageURI, (base64Data) => {
          // base64Data contains the base64string of the image
      }, (reason) => console.error(reason));
 }, (reason) => console.error(reason));

1 Comment

React Native warns developers not to use ImageEditor anymore: Warning: ImageStore is deprecated and will be removed in a future release. To get a base64-encoded string from a local image use either of the following third-party libraries:* expo-file-system: readAsStringAsync(filepath, 'base64')* react-native-fs: readFile(filepath, 'base64')
9

To convert image to base64 in React native, the FileReader utility is helpful:

const fileReader = new FileReader();
fileReader.onload = fileLoadedEvent => {
  const base64Image = fileLoadedEvent.target.result;
};
fileReader.readAsDataURL(imagepath); 

This requires react-native-file.

Another alternative, and probably the preferred alternative, is to use NativeModules. The Medium article shows how. It requires creating a native module.

NativeModules.ReadImageData.readImage(path, (base64Image) => {
  // Do something here.
});

Comments

9

No library need, use built in JS features

export default async function base64File(url) {
  const data = await fetch(url);
  const blob = await data.blob();
  return new Promise(resolve => {
    const reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = () => {
      const base64data = reader.result;
      resolve(base64data);
    };
  });
}

3 Comments

I needed to generate a base64 using the url of an image saved in cloudinary and this was super helpful. I didn't need to install any library or whatsoever. PS: I am on RN Version: 0.70.4 and React Version: 18.1.0
Same here, React 18.2.0 and RN 0.71.3
This is super amazing!
6

You can use react-native-image-base64. You have to give image url and it returns the base64 string of image.

ImgToBase64.getBase64String('file://youfileurl')
  .then(base64String => doSomethingWith(base64String))
  .catch(err => doSomethingWith(err));

1 Comment

[!] CocoaPods could not find compatible versions for pod "React/Core": In Podfile: react-native-fetch-blob (from ../node_modules/react-native-fetch-blob) was resolved to 0.10.6, which depends on React/Core None of your spec sources contain a spec satisfying the dependency: React/Core. You have either: * out-of-date source repos which you can update with pod repo update or with pod install --repo-update. * mistyped the name or version. * not added the source repo that hosts the Podspec to your Podfile.
5

react-native-image-picker includes a base64 data node in the returned object. fyi

1 Comment

thanks a lot. I just know this about the library I already used. @zematdev
5

In case you're using expo in a managed workflow and cannot use react-native-fs, you can do it using the expo-file-system library. Here's a helper function that will do the trick by only providing an image URL and will return a base64 encoded image. PS: It doesn't contain the base64 prefix, you need to include it yourself based on the image type you have.


import * as FileSystem from 'expo-file-system';


async function getImageToBase64(imageURL) {
  let image;

  try {
    const { uri } = await FileSystem.downloadAsync(
      imageURL,
      FileSystem.documentDirectory + 'bufferimg.png'
    );

    image = await FileSystem.readAsStringAsync(uri, {
      encoding: 'base64',
    });
  } catch (err) {
    console.log(err);
  }

  return image;
}

An example usage in a React Native Image component is as follows:

<Image
  style={{ width: 48, height: 48 }}
  source={{ uri: `data:image/png;base64,${image}` }}
/>

Comments

2

i am using react-native-image-crop-picker add includeBase64 prop it will response in base64 converted image

ImagePicker.openPicker({
  width: 300,
  height: 400,
  includeBase64:true
}).then(image => {
  console.log(image.data);
});

Comments

1
If You are using **react-native-image-picker**
Then it includes base64 string in response object

    if you are  using any  other library i.e. **react-native-document-picker**
    then you have to use **react-native-fs** library 
    
    import RNFS from 'react-native-fs';
    
      RNFS.readFile(item.uri, 'base64').then((res) => {
                  //Here in enter code here res you  will get base64 string 
                });

  

Comments

1

Try this code

import * as FileSystem from "expo-file-system";

// others state
const [base64Image, setBase64Image] = useState(null);
// others code
useEffect(() => {
        async function getBase64() {
          const base64 = await FileSystem.readAsStringAsync(imageUrl, { encoding: 'base64' });      
          const base64Data = "data:image/png;base64,"+base64;
          setBase64Image(base64Data);
        }
        getBase64()
    }, [imageUrl]);

Comments

0

I used another package: react-native-fs

import RNFS from 'react-native-fs';

var data = await RNFS.readFile( "file://path-to-file", 'base64').then(res => { return res });

This works fine.

Comments

0

For me upalod file mp4 from local file on devies to Facebook or another social:

var data = await RNFS.readFile( `file://${this.data.path}`, 'base64').then(res => { return res });
        const shareOptions = {
            title: 'iVideo',
            message: 'Share video',
            url:'data:video/mp4;base64,'+ data,
            social: Share.Social.FACEBOOK,
            filename: this.data.name , // only for base64 file in Android 
        };     
        Share.open(shareOptions).then(res=>{
           Alert.alert('Share Success`enter code here`!')
        }).catch(err=>{
            console.log('err share', err);
        });

Comments

0
import ImgToBase64 from 'react-native-image-base64';
 
ImgToBase64.getBase64String(trainingRooms)
            .then(base64String => {
                console.log("Sourabh____ ImgToBase64 base64String "+base64String );
            })
            .catch(err => {
                console.log("Sourabh____ ImgToBase64 error "+err);
            })

Comments

-1

Convert url image to base64

const getBase64ImageFromUrl = url => fetch(url) .then(response => response.blob()) .then( blob => new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; blob = new Blob([blob], {type: 'image/png'}); reader.readAsDataURL(blob); }), );

await getBase64ImageFromUrl("https://your image url");

1 Comment

As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.