上载到Firebase存储已执行,但图像返回为黑色正方形。尝试了一切

时间:2019-02-07 14:47:30

标签: reactjs firebase react-native firebase-storage expo

嘿,我一直在使用react native + firebase auth / storage / realtimedb构建一个全栈火种应用程序。

到目前为止,一切都很好,但是几天前我遇到了一个问题,我不知道这是怎么回事。

我获取了正确的图像uri,并将其作为参数传递给我的uploadImage函数,并将其转换为Blob。它将文件上传到Firebase存储,但这不是我的图像。这就是上传的内容:

Image that is getting uploaded.

Weird things going on in the file description of my 'image'

我注意到的第一件事是,当我上传图像并查看假定图像的描述时,我看到大小为600,000字节,这很奇怪,因为当我通过Firebase存储控制台手动上传图片时,它们很少兆字节。

第二件事是图像预览无法正常工作。

editAvi = async () => {
      console.log('wtf')
        await Permissions.askAsync(Permissions.CAMERA_ROLL);
        const { cancelled, uri } = await ImagePicker.launchImageLibraryAsync({
          allowsEditing: true,
        });
        if (!cancelled) {
          this.setState({ image: uri });
  }
        console.log('The image is' + this.state.image)
      };
  uploadImage = async (uri, imageName) => {
    // Create file metadata including the content type
    var metadata = {
      contentType: 'image/jpeg',
    }
    // Points to the root reference

    var storageRef = firebase.storage().ref();

    // Points to 'images'
    const response = await fetch(uri);
    const blob = await response.blob();

    var ref = storageRef.child('images/' + this.state.currentID);
    ref.put(uri, metadata);
      console.log('This is the blob: ' + blob)
  }

我已经进行了两天的广​​泛研究,并且由于我所处的Web开发问题而多次询问,但仍然无法解决。

请帮助我解决此问题!这是我需要完成此应用程序的最后一件事。 :)

2 个答案:

答案 0 :(得分:0)

当我寻找完全相同的问题的解决方案时,发现了这个问题。经过约12小时的试验和错误,我在创建blob时添加了“ application / octet-stream; BASE64”类型(使用rn-fetch-blob),将其修复。

Blob.build(data,{type:'application / octet-stream; BASE64'});

不确定这是用于创建Blob的方法,但如果是,将其用作类型可以解决我的问题。

答案 1 :(得分:0)

我也在寻找答案时发现了这个问题。我能够按照Github问题https://github.com/expo/expo/issues/2402#issuecomment-443726662

的建议解决此问题

主要思想是替换

const response = await fetch(uri);
const blob = await response.blob();
var ref = storageRef.child('images/' + this.state.currentID);
ref.put(uri, metadata);

const blob = await new Promise((resolve, reject) => {
            const xhr = new XMLHttpRequest();
            xhr.onload = () => {
                resolve(xhr.response);
            };
            xhr.onerror = (e) => {
                reject(new TypeError("Network request failed"));
            };
            xhr.responseType = "blob";
            xhr.open("GET", uri, true);
            xhr.send(null);
        });
var ref = storageRef.child('images/' + this.state.currentID);
ref.put(blob, metadata);

使用Expo时获取的内容在ReacNative中存在问题。

希望这可以解决。