Convert image path to blob react native

后端 未结 4 1913
隐瞒了意图╮
隐瞒了意图╮ 2021-02-19 04:21

Problem

I am trying to create an app with react native and firebase. One of the features I would like for this app is the ability to upload images. I

相关标签:
4条回答
  • 2021-02-19 04:49

    You need to install rn-fetch-blob module:

    npm install --save rn-fetch-blob
    

    Then, do the following:

    import RNFetchBlob from 'rn-fetch-blob';
    
    const Blob = RNFetchBlob.polyfill.Blob;
    const fs = RNFetchBlob.fs;
    window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest;
    window.Blob = Blob;
    
    function uploadImage(path) {
        const imageFile = RNFetchBlob.wrap(path);
    
        // 'path/to/image' is where you wish to put your image in
        // the database, if you would like to put it in the folder
        // 'subfolder' inside 'mainFolder' and name it 'myImage', just 
        // replace it with 'mainFolder/subfolder/myImage'
        const ref = firebase.storage().ref('path/to/image');
        var uploadBlob = null;
    
        Blob.build(imageFile, { type: 'image/jpg;' })
            .then((imageBlob) => {
                uploadBlob = imageBlob;
                return ref.put(imageBlob, { contentType: 'image/jpg' });
            })
            .then(() => {
                uploadBlob.close();
                return ref.getDownloadURL();
            })
            .((url) => {
                // do something with the url if you wish to
            })
            .catch(() => {
                dispatch({
                    type: UPDATE_PROFILE_INFO_FAIL,
                    payload: 'Unable to upload profile picture, please try again'
                });
            });
    }
    

    Please do ask if there's any part of the code that you don't understand. To upload multiple images, simply wrap this code with a for loop. Or if you want to make sure that every image is uploaded without any error, use Promise

    0 讨论(0)
  • 2021-02-19 05:00

    Refer this link - https://github.com/dailydrip/react-native-firebase-storage/blob/master/src/App.js#L43-L69

    Following block of code is working fine.

    uploadImage(uri, mime = 'application/octet-stream') {
        return new Promise((resolve, reject) => {
          const uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri
          let uploadBlob = null
    
          const imageRef = FirebaseClient.storage().ref('images').child('image_001')
    
          fs.readFile(uploadUri, 'base64')
            .then((data) => {
              return Blob.build(data, { type: `${mime};BASE64` })
            })
            .then((blob) => {
              uploadBlob = blob
              return imageRef.put(blob, { contentType: mime })
            })
            .then(() => {
              uploadBlob.close()
              return imageRef.getDownloadURL()
            })
            .then((url) => {
              resolve(url)
            })
            .catch((error) => {
              reject(error)
          })
        })
      }
    
    0 讨论(0)
  • 2021-02-19 05:02

    If you are using expo (>=26), then you can do it easily with the following lines of code.

    uploadImage = async(imageUri) => {
      const response = await fetch(imageUri);
      const blob = await response.blob();
      var ref =   firebase.storage().ref().child("image.jpg");
      return ref.put(blob);
    }
    

    Reference: https://youtu.be/KkZckepfm2Q

    0 讨论(0)
  • 2021-02-19 05:10

    Not sure whom this might help, but if you're using MediaLibrary to load images from the gallery, then the uri comes in the format of uri = file:///storage/emulated/0/DCIM/Camera/filename.jpg

    In this case, using fetch(uri) didn't help me get the blob.

    But if you use fetch(uri.replace("file:///","file:/")) and then follow @sriteja Sugoor's answer, you'll be able to upload the file blob.

    0 讨论(0)
提交回复
热议问题