【问题标题】:How to display image blob for react native如何显示图像blob以进行本机反应
【发布时间】:2018-07-02 19:59:59
【问题描述】:

我尝试在我的 react-native 应用中显示图像。我已将照片上传到 我的 Firebase 存储,它的工作。然后我尝试从 Firebase Storage 显示我的图像,但文件是 blob。我想将 blob 转换为图像,但我不知道语法。可能是你们中的一个人可以帮助我解决这个问题。

我应该在哪里放置 RNFetch blob?我尝试将其放入 componentWillMount 并显示错误。

uploadImage(uri, mime = 'application/octet-stream') {
        return new Promise((resolve, reject) => {
            const uploadUri = uri
            let uploadBlob = null

            const imageRef = firebase.storage().ref('profileImg').child(`${this.state.user.uid}/Profile Image - ${this.state.user.uid}`)

            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) => {
                console.log(url)
                resolve(url)
            })
            .catch((e) => {
                console.log(e)
                reject(e)
            })
        })
    }

    getProfileImage(){
        let options = {
        title: 'Choose Photo',
        storageOptions: {
        skipBackup: true,
        path: 'images'
      }
    };

    ImagePicker.showImagePicker(options, (response) => {
        console.log('Response = ', response);

          if (response.didCancel) {
            console.log('User cancelled image picker');
          }
          else if (response.error) {
            console.log('ImagePicker Error: ', response.error);
          }
          else if (response.customButton) {
            console.log('User tapped custom button: ', response.customButton);
          }
          else {
            let image_uri = { uri: 'data:image/jpeg;base64,' + response.data };
            this.uploadImage(response.uri)
            .then((url) => { 
                console.log('uploaded')
                this.setState({
                    image_uri: url,
                });
            })
            .catch((error) => console.log(error))
            firebase.auth().currentUser.updateProfile({
                photoURL: this.state.image_uri
            });
          }
      })
    }

【问题讨论】:

标签: javascript reactjs react-native firebase-storage


【解决方案1】:

我遇到了同样的问题,我实施的解决方法是将文件类型放入状态

在构造函数中

constructor() {
    super();
    // we will change it to fill the image file type from response
    this.state = {
        fileType: ""
    };
}

在 getImage() 函数中我们应该改变状态来放置文件类型

getImage() {
    ImagePicker.showImagePicker(options, response => {
        console.log("Response = ", response);
        this.setState({
            fileType: response.type
        });
......... the rest of the code

并且在 uploadImage() 中,您应该将 mime 置于此处实现的状态的 fileType

 uploadImage(uri, mime = this.state.fileType) {
    return new Promise((resolve, reject) => {
        const uploadUri =
            Platform.OS === "ios" ? uri.replace("file://", "") : uri;
        let uploadBlob = null;

        const imageRef = firebase
            .storage()
            .ref("images/")
            .child(Date.now());

        fs.readFile(uploadUri, "base64")
            .then(data => {
                return Blob.build(data, { type: `${mime};BASE64` });
            })
            .then(blob => {
                uploadBlob = blob;
                var metadata = {
                    contentType: mime
                };

                return imageRef.put(uri, metadata);
            })
            .then(() => {
                uploadBlob.close();
                return imageRef.getDownloadURL();
            })
            .then(url => {
                resolve(url);
            })
            .catch(error => {
                reject(error);
            });
    });
}

顺便说一句,这是我的第一个答案

【讨论】:

    【解决方案2】:

    这适用于我的情况:

    userPhoto 是一个 blob 字符串。

      <img className="pic__photo" src={"data:image/png;base64," + userPhoto} />
    

    【讨论】:

      【解决方案3】:

      现在,您要做的是通过将base64 转换为blob 并从成功查询中获取blob,将图像上传到firebase并转换为base64 以再次显示。

      由于您已经在使用 promise,您可以做的是检查图像是否已上传成功,然后显示相同的base64,否则显示您的original data

      // Default Image data
      let image_uri = { uri: 'data:image/jpeg;base64,' + response.data };
      
      this.uploadImage(response.uri)
                  .then((url) => { 
                      // Success, replace with base64 you've got
                      console.log('uploaded')
                      this.setState({
                          image_uri
                      });
                  })
                  .catch(error => {
                     this.setState({
                          image_uri: // SOME DEFAULT IMAGE VALUE
                      });
                  })
      

      【讨论】:

        猜你喜欢
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多