Firebase Storage : Fail

Please provide the following:

  1. SDK Version: 42.0
  2. Platforms(Android/iOS/web/all): All
  3. Add the appropriate “Tag” based on what Expo library you have a question on.

Hello there. I am trying to upload some information and an image to firebase.
The information uploads but not the image. I can view the image in-app but when I try to upload it crashes with the following error.

"Unhandled Rejection (Error): You attempted to use a firebase module that’s not installed on your Android project by calling firebase.app().
Ensure you have:

  1. imported the ‘io.invertase.firebase.app.ReactNativeFirebaseAppPackage’ module in your ‘MainApplication.java’ file.
  2. Added the ‘new ReactNativeFirebaseAppPackage()’ line inside of the RN ‘getPackages()’ method list.
    See React Native Firebase - A react native firebase library supporting both android and ios native firebase SDK's for full setup instructions."

I have tried various pieces of code from the internet but they seem to change a lot depending on SDK version. (ie.sometimes storage(), sometimes firebase.storage())

Is there a more straight forward way to upload an image with the latest SDK?

Thanks in advance.

Richard

All code below…

import React, { useEffect, useState } from 'react';

import { Image, FlatList, Keyboard, Text, TextInput, TouchableOpacity, View, SelectInput, Platform } from 'react-native';

import styles from './styles';

import { firebase } from '../../firebase/config';

import storage from '@react-native-firebase/storage';

import * as Progress from 'react-native-progress';

import * as ImagePicker from 'expo-image-picker';

export default function HomeScreen(props) {

    const [titleText, setTitleText] = useState('')

    const [locationText, setLocationText] = useState('')

    const [descriptionText, setDescriptionText] = useState('')

    const [image, setImage] = useState(null);

    const [entities, setEntities] = useState([])

    const entityRef = firebase.firestore().collection('entities')

    const userID = props.extraData.id;

    const [uploading, setUploading] = useState(false);

    const [transferred, setTransferred] = useState(0);

    let openImagePickerAsync = async () => {

        let permissionResult = await ImagePicker.requestMediaLibraryPermissionsAsync();

    

        if (permissionResult.granted === false) {

          alert("Permission to access camera roll is required!");

          return;

        }

    

        let pickerResult = await ImagePicker.launchImageLibraryAsync();

        console.log(pickerResult);

        setImage(pickerResult.uri);

    }

    useEffect(() => {

        entityRef

            .where("authorID", "==", userID)

            .orderBy('createdAt', 'desc')

            .onSnapshot(

                querySnapshot => {

                    const newEntities = []

                    querySnapshot.forEach(doc => {

                        const entity = doc.data()

                        entity.id = doc.id

                        newEntities.push(entity)

                    });

                    setEntities(newEntities)

                },

                error => {

                    console.log(error)

                }

            )

    }, [])

    const uploadImage = async () => {

        const { uri } = image;

        //const filename = entityRef;

        const filename = "test.png";

        //const uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri;

        const uploadUri = uri;

        setUploading(true);

        setTransferred(0);

        const task = storage()

          .ref(filename)

          .putFile(uploadUri);

        // set progress state

        task.on('state_changed', snapshot => {

          setTransferred(

            Math.round(snapshot.bytesTransferred / snapshot.totalBytes) * 10000

          );

        });

        try {

          await task;

        } catch (e) {

          console.error(e);

        }

        setUploading(false);

        Alert.alert(

          'Photo uploaded!',

          'Your photo has been uploaded to Firebase Cloud Storage!'

        );

        setImage(null);

      };

    const onAddButtonPress = () => {

        if (titleText && titleText.length > 0) {

            const timestamp = firebase.firestore.FieldValue.serverTimestamp();

            const data = {

                text: titleText,

                location: locationText,

                description: descriptionText,

                authorID: userID,

                createdAt: timestamp,

            };

            entityRef

                .add(data)

                .then(_doc => {

                    setTitleText('')

                    setLocationText('')

                    setDescriptionText('')

                    Keyboard.dismiss()

                })

                .catch((error) => {

                    alert(error)

                });

                uploadImage();

        

        }

    }

    const renderEntity = ({item, index}) => {

        return (

            <View style={styles.entityContainer}>

                <Text style={styles.entityText}>

                    {index}. {item.text}

                </Text>

            </View>

        )

    }

    return (

        <View style={styles.container}>

            <View style={styles.formContainer}>

                <TextInput

                    style={styles.input}

                    placeholder='Add new title'

                    placeholderTextColor="#aaaaaa"

                    onChangeText={(text) => setTitleText(text)}

                    value={titleText}

                    underlineColorAndroid="transparent"

                    autoCapitalize="none"

                />

                <TextInput

                    style={styles.input}

                    placeholder='Location'

                    placeholderTextColor="#aaaaaa"

                    onChangeText={(text) => setLocationText(text)}

                    value={locationText}

                    underlineColorAndroid="transparent"

                    autoCapitalize="none"

                />

                <TextInput

                    style={styles.input}

                    placeholder='Description'

                    placeholderTextColor="#aaaaaa"

                    onChangeText={(text) => setDescriptionText(text)}

                    value={descriptionText}

                    underlineColorAndroid="transparent"

                    autoCapitalize="none"

                />

                <View>

                    {image && <Image source={{ uri: image }} style={{ width: 200, height: 200 }} />}

                </View>

                

                <TouchableOpacity onPress={openImagePickerAsync} style={styles.button}>

                    <Text style={styles.buttonText}>Pick a photo</Text>                    

                </TouchableOpacity>

                <TouchableOpacity style={styles.button} onPress={onAddButtonPress}>

                    <Text style={styles.buttonText}>Add</Text>

                </TouchableOpacity>

            </View>

            { entities && (

                <View style={styles.listContainer}>

                    <FlatList

                        data={entities}

                        renderItem={renderEntity}

                        keyExtractor={(item) => item.id}

                        removeClippedSubviews={true}

                    />

                </View>

            )}

        </View>

    )

}

Hi

Is this in Expo Go, dev client, or a standalone app, etc?

How are you building the app?

Can you post the dependencies section of your package.json?

Hi there. Thanks for your reply.

I think it’s in Expo GO.
Running on a windows laptop (expo start) and then web client.
I was having a lot of trouble with dependencies so I started an app from scratch,installed packages and then copied and modified code.
Packages below…

“dependencies”: {

"@react-native-community/datetimepicker": "3.5.2",

"@react-native-community/masked-view": "0.1.10",

"@react-native-firebase/storage": "^12.4.0",

"@react-navigation/native": "^5.4.0",

"@react-navigation/stack": "^5.3.7",

"base-64": "^0.1.0",

"expo": "^42.0.0",

"expo-image-picker": "~10.2.2",

"firebase": "8.2.3",

"react": "~16.13.1",

"react-admin": "^3.17.1",

"react-dom": "~16.9.0",

"react-native": "https://github.com/expo/react-native/archive/sdk-39.0.1.tar.gz",

"react-native-firebase": "^5.6.0",

"react-native-gesture-handler": "~1.10.2",

"react-native-keyboard-aware-scroll-view": "^0.9.1",

"react-native-progress": "^5.0.0",

"react-native-reanimated": "~2.2.0",

"react-native-safe-area-context": "3.2.0",

"react-native-screens": "~3.4.0",

"react-native-web": "~0.11.7"

},

“devDependencies”: {

"@babel/core": "^7.8.6",

"babel-preset-expo": "~8.1.0"

},

“private”: true

}

Hi

I’ve never tried Firebase, but I think you are mixing up the “Firebase JS API” and the native Firebase SDK.

Maybe try without the native SDK to start with. It looks like you should only have firebase in your dependencies and not things like react-native-firebase and @react-native-firebase/storage. The code should look something like the examples in the “Using Firebase” guide.

Thanks. That did help!
Something now gets uploaded.

The problem is, it’s not the image that gets uploaded but a 9 byte text file that just says undefined!
Any ideas? :slight_smile:
Thanks
Richard

Off hand, not really. Could you post a simple example that demonstrates the problem?

So, I can choose and select an image and display that image.
But when I try to upload the image, the result is a text file with the word ‘undefined’ in it uploaded each time. It does upload with the right name. I figure I should put something else but I can’t figure out what. I have tried image/uri and also tried with blob/result etc. They all have the same issue.

    const { uri } = image;
    const filename = "images/"+userID+time+".png";
    const uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri;
      .storage()
      .ref(filename)
      .put(uploadUri);

The issue and the above code fragments seem to imply that uri is undefined.
What do you get it you do this:

console.log("image:", JSON.stringify(image));
console.log("uri:", uri);
console.log("uploadUri:", uploadUri);

Logs below. Thanks for looking.

log.js:24 [HMR] Waiting for update signal from WDS…
react-dom.development.js:25195 Download the React DevTools for a better development experience: https://fb.me/react-devtools
index.js:85 Running application “main” with appParams:
Object
Development-level warnings: ON.
Performance optimizations: OFF.
react-native-logs.fx.ts:22 Warning: componentWillMount has been renamed, and is not recommended for use. See https://fb.me/react-async-component-lifecycle-hooks for details.

  • Move code with side effects to componentDidMount, and set initial state in the constructor.
  • Rename componentWillMount to UNSAFE_componentWillMount to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run npx react-codemod rename-unsafe-lifecycles in your project source folder.

Please update the following components: ScrollView
warn @ react-native-logs.fx.ts:22
react-native-logs.fx.ts:22 Warning: componentWillReceiveProps has been renamed, and is not recommended for use. See https://fb.me/react-async-component-lifecycle-hooks for details.

  • Move data fetching code or side effects to componentDidUpdate.
  • If you’re updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state
  • Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run npx react-codemod rename-unsafe-lifecycles in your project source folder.

Please update the following components: TouchableOpacity
warn @ react-native-logs.fx.ts:22
HomeScreen.js:49 FirebaseError: The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/wezycle/firestore/indexes?create_composite=Ckhwcm9qZWN0cy93ZXp5Y2xlL2RhdGFiYXNlcy8oZGVmYXVsdCkvY29sbGVjdGlvbkdyb3Vwcy9lbnRpdGllcy9pbmRleGVzL18QARoMCghhdXRob3JJRBABGg0KCWNyZWF0ZWRBdBACGgwKCF9fbmFtZV9fEAI
at new e (prebuilt-30db9a88-9b75cc8d.js:418)
at prebuilt-30db9a88-9b75cc8d.js:11021
at prebuilt-30db9a88-9b75cc8d.js:11022
at e.onMessage (prebuilt-30db9a88-9b75cc8d.js:11044)
at prebuilt-30db9a88-9b75cc8d.js:10961
at prebuilt-30db9a88-9b75cc8d.js:10992
at prebuilt-30db9a88-9b75cc8d.js:15944
HomeScreen.js:29 Picker Result: Object
HomeScreen.js:67 image: "data:image/jpeg;base64,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
HomeScreen.js:68 uri: data:image/jpeg;base64,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
HomeScreen.js:69 uploadUri: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QCwRXhpZgAASUkqAAgAAAADADEBAgAHAAAAMgAAADsBAgAlAAAAOQAAAGmHBAABAAAAXgAAAAAAAABHb29nbGUAUklDSEFSREZJVFpTSU1PTlMgICAgICAgICAgICAgICAgICAgAAIAAJAHAAQAAAAwMjIwhpIHACwAAAB8AAAAAAAAAEFTQ0lJAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg/+IL+ElDQ19QUk9GSUxFAAEBAAAL6AAAAAACAAAAbW50clJHQiBYWVogB9kAAwAbABUAJAAfYWNzcAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAPbWAAEAAAAA0y0AAAAAKfg93q/yVa54QvrkyoM5DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZGVzYwAAAUQAAAB5YlhZWgAAAcAAAAAUYlRSQwAAAdQAAAgMZG1kZAAACeAAAACIZ1hZWgAACmgAAAAUZ1RSQwAAAdQAAAgMbHVtaQAACnwAAAAUbWVhcwAACpAAAAAkYmtwdAAACrQAAAAUclhZWgAACsgAAAAUclRSQwAAAdQAAAgMdGVjaAAACtwAAAAMdnVlZAAACugAAACHd3RwdAAAC3AAAAAUY3BydAAAC4QAAAA3Y2hhZAAAC7wAAAAsZGVzYwAAAAAAAAAfc1JHQiBJRUM2MTk2Ni0yLTEgYmxhY2sgc2NhbGVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAAAkoAAAD4QAALbPY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9kZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi0xIERlZmF1bHQgUkdCIENvbG91ciBTcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAAAAAUAAAAAAAAG1lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlhZWiAAAAAAAAADFgAAAzMAAAKkWFlaIAAAAAAAAG+iAAA49QAAA5BzaWcgAAAAAENSVCBkZXNjAAAAAAAAAC1SZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDIDYxOTY2LTItMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPbWAAEAAAAA0y10ZXh0AAAAAENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0sIDIwMDkAAHNmMzIAAAAAAAEMRAAABd////MmAAAHlAAA/Y////uh///9ogAAA9sAAMB1/9sAhAADAgIKCgoKCgoKCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAoKCggICw0KCA0ICAkIAQMEBAYFBgoGBgoNDQoNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ3/wAARCAMOA8cDASIAAhEBAxEB/8QAHgAAAQQDAQEBAAAAAAAAAAAABQMEBgcBAggACQr/xABOEAABAgQDBQUGBAUDAQcDAQkBAhEAAxIhBAUxBiJBUWEHEzJxgSNCkaGx8AhSwdEUM2Lh8RVDciQWNFOCkqKyY8LSCURUcxclZIPyRf/EABwBAAIDAQEBAQAAAAAAAAAAAAIDAAEEBQYHCP/EAD4RAAIBAgQEAwcEAQMDAwUBAAABAgMRBCEx8AUSQVETYXEGIoHB0eHxMpGhsSMUM0IVUmIHgpIkQ3Ki

Got it working by adding following code…

   const response = await fetch(uploadUri);
    const blob = await response.blob();
    const task = firebase
      .storage()
      .ref(filename)
      .put(blob);

The problem was that image was a string (a data URL), but the code was expecting an object containing a url key.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.