当前位置: 首页 > 知识库问答 >
问题:

将图像路径转换为blob react本机

余信然
2023-03-14

我正在尝试用react native和firebase创建一个应用程序。我想这个应用程序的功能之一是上传图像的能力。不过,我上传图片到firebase存储时遇到了一些问题。我使用expo的图像拾取器来寻找用户想要上传的图像的路径,但是一旦我有了路径,我不知道如何将它转换成我可以上传到firebase的东西。

有人能帮我把图像的路径转换成我可以用react native上传到firebase存储的东西吗?

我尝试使用:

     _pickImage = async () => {
    let result = await ImagePicker.launchImageLibraryAsync({
      MediaTypeOptions: 'Images',
      quality: 0.4,
_uploadAsByteArray = async (pickerResultAsByteArray, progressCallback) => {

    try {

      var metadata = {
        contentType: 'image/jpeg',
      };

      var storageRef = firebase.storage().ref();
      var ref = storageRef.child('images/'+expoID+'/'+this.state.time)
      let uploadTask = ref.put(pickerResultAsByteArray, metadata)

      uploadTask.on('state_changed', function (snapshot) {

        progressCallback && progressCallback(snapshot.bytesTransferred / snapshot.totalBytes)

        var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
        console.log('Upload is ' + progress + '% done');

      }, function (error) {
        console.log("in _uploadAsByteArray ", error)
      }, function () {
        var downloadURL = uploadTask.snapshot.downloadURL;
        console.log("_uploadAsByteArray ", uploadTask.snapshot.downloadURL)
    this.setState({imageUploaded:true})
      });


    } catch (ee) {
      console.log("when trying to load _uploadAsByteArray ", ee)
    }
  }


  convertToByteArray = (input) => {
    var binary_string = this.atob(input);
    var len = binary_string.length;
    var bytes = new Uint8Array(len);
    for (var i = 0; i < len; i++) {
      bytes[i] = binary_string.charCodeAt(i);
    }
    return bytes
  }

  atob = (input) => {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

    let str = input.replace(/=+$/, '');
    let output = '';

    if (str.length % 4 == 1) {
      throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");
    }
    for (let bc = 0, bs = 0, buffer, i = 0;
      buffer = str.charAt(i++);

      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
    ) {
      buffer = chars.indexOf(buffer);
    }

    return output;
  }


uploadImage(bsfdata){
    this.setState({imageUploaded:false})
    this._uploadAsByteArray(this.convertToByteArray(bsfdata), (progress) => {
    this.setState({ progress:progress })
    })
  }
  base64:true,
});



 /* if (!result.cancelled) {
      this.setState({ image: result.uri });
      let formData = new FormData();
        formData.append('photo', {
           uri,
           name: `photo.${fileType}`,
           type: `image/${fileType}`,
     });}*/
      this.uploadImage(result.base64);
  };

}

我已经尝试过添加注释的代码,它没有上传任何内容,我已经尝试了现在的代码,这给了我错误当前只能从其他 Blob 创建 Blob,并且上传进度永远不会超过 0%。

共有3个答案

萧无尘
2023-03-14

您需要安装rn-getch-blob模块:

npm install --save rn-fetch-blob

然后,执行以下操作:

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'
            });
        });
}

请询问代码中是否有您不理解的部分。要上传多张图片,只需用 for 循环包装此代码即可。或者,如果您想确保上传每张图片没有任何错误,请使用promise

安高义
2023-03-14

请参阅此链接 - https://github.com/dailydrip/react-native-firebase-storage/blob/master/src/App.js#L43-L69

下面的代码块工作正常。

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)
      })
    })
  }
公西俊民
2023-03-14

如果您正在使用expo(

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);
}

参考:https://youtu.be/KkZckepfm2Q

 类似资料:
  • 问题内容: 这是一个有趣的话题。基本上,我有一个包含一些文本的图像。如何从图像中提取文本? 我已经尝试了很多事情,但是我所做的一切都很繁琐,通常无法正常工作。我只是想知道是否有一个相当简单的方法来做到这一点。 我遇到了这个问题:http : //sourceforge.net/projects/javaocr/。我已经尝试了好几个小时,但是我无法将其从图像中转换为文本。 谢谢大家! 问题答案: 您

  • 问题内容: 我在ttf文件中有一种字体,想要生成文本转换为路径的SVG。我不需要图像(因此使用imagettftext或Image Magick字体渲染功能是不够的),我需要可以放大和缩小的形状,我想丢失有关所用字体的信息,并且不想在其中引用它SVG文件(因此此处不能使用字体声明)。可能吗? 问题答案: 我创建了自己的类来处理SVG字体文件并将文本转换为字形。使用示例: 结果示例: 我班的代码:

  • 问题内容: 我有文件A的绝对路径。 我有一个从文件A的目录到文件B的相对路径。此路径可以并且将使用“ ..”以任意复杂的方式向上移动目录结构。 范例A: 示例B: 我如何结合这两者以获得 最简单的 绝对路径到文件B? 问题答案: 如果我的问题正确,那么您可以执行以下操作:

  • 问题内容: 有没有一种方法可以将JPanel(尚未显示)转换为BufferedImage? 谢谢, 杰夫 问题答案: 在BufferedImage中,您可以创建一个图形对象,可用于在JPanel上调用画图,如下所示: 您可能需要确保首先设置面板的尺寸。

  • 我有一个UIExtView和一个UIImageView,我想把它们转换成一个单独的图像来共享。 SaveImageView是ImageView,我想在这里保存textview的图像。 Textview可以在屏幕上移动它,所以我决定保存它们的最终位置,并将其交给SaveImageView。 首先转换图像中的UItext View并保存他的位置。 然后,我想加入两个Imageview,成一个单一的图像

  • 问题内容: 在我的 文件系统中, 我的工作目录在这里: C:\ temp \ a \ b \ c \ d 在b \ bb下有文件:tmp.txt C:\ temp \ a \ b \ bb \ tmp.txt 如果要从工作目录转到该文件,请使用以下路径: 如果文件不存在,我想记录完整路径并告诉用户: “文件C:\ temp \ a \ b \ bb \ tmp.txt不存在” 。 我的问题: 我需