【问题标题】:How to show the image from the cloud firestore in react native?如何在本机反应中显示来自云火库的图像?
【发布时间】:2021-03-09 19:09:32
【问题描述】:

已解决! : 查看下面的回复,非常感谢帮助的人!我还必须像这样更改存储规则。它在存储中>规则:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

我这样做只是为了测试目的。写真正的程序时不要让所有人都写!

问题:

这是我的云存储,如何在我的 react native 应用中显示此图像?我试着这样做:

<Image style={styles.stretch} source={{
  uri: 'gs://mezuniyet2r.appspot.com/images/erkek.jpg',
}}
  />

我在这里缺少什么?它不像这样工作。它不应该像这样工作吗?我在官方文档中找不到这样的东西。确实非常糟糕的文档。它没有说太多。有人可以帮帮我吗?这是完整的代码:

import React, {Component} from 'react';
import {
Platform,
SafeAreaView,
StyleSheet,
ScrollView,
View,
Text,
Image,
Button,
StatusBar,
} from 'react-native';
import firebase from '@react-native-firebase/app'
import firestore from '@react-native-firebase/firestore'
import { format } from "date-fns";
import storage from '@react-native-firebase/storage';
class App extends Component {
state = {
tablo: {
adSoyad: "",
yas: "",
dogumTarihi: "",
mezunDurumu: "",

}
}
constructor(props) {
super(props);
this.getUser();
this.subscriber=firestore().collection("tablo").doc
('J6mAav1kjkcjrMupeOqX').onSnapshot(doc => {
this.setState({
tablo: {
adSoyad: doc.data().adSoyad,
yas: doc.data().yas,
dogumTarihi: doc.data().dogumTarihi,
mezunDurumu:doc.data().mezunDurumu,

}
}
)
});
}

getParsedDate(date){
  date = String(date).split(' ');
  var days = String(date[0]).split('-');
  var hours = String(date[1]).split(':');
  return [parseInt(days[2]), parseInt(days[1])-1, parseInt(days[0]), parseInt(hours[0]), parseInt(hours[1]), parseInt(hours[2])];
}



getUser= async() => {
const userDocument= await firestore().collection("tablolar").doc
("J6mAav1kjkcjrMupeOqX").get()
console.log(userDocument)
}
render() {
  var mezund;
  var date = new String(this.state.tablo.dogumTarihi);
  var date2=this.getParsedDate(date);

//const reference = storage().ref('erkek.jpg');
  //var storageRef = firebase.storage().ref();
  //var mountainsRef = storageRef.child('erkek.jpg');
  //var mountainImagesRef = storageRef.child('images/erkek.jpg');
  //mountainsRef.name === mountainImagesRef.name;
  console.log(date2);


  //this doesn't work though how do we do this??? it gives undefined.
  if(this.state.tablo.mezunDurumu==false){mezund="Mezun Değil"}
  else if(this.state.tablo.mezunDurumu=true){mezund="mezun"}
 // var dtarih= new String(this.state.tablo.dogumTarihi);
 
 

 
return (
<View style={styles.body}>
<Text style={styles.row}>Ad Soyad: {this.state.tablo.adSoyad}</Text>
<Text style={styles.row}>Yaş: {this.state.tablo.yas}</Text>
<Text style={styles.row}>Doğum Tarihi: {date}</Text>

<Text style={styles.row}>Mezun Durumu: {mezund}</Text>
<Image style={styles.stretch} source={{
  uri: 'gs://mezuniyet2r.appspot.com/erkek.jpg',
}}
  />
</View>
);
}
}
const styles=StyleSheet.create({
  body:{
    padding: 25,
    margin:25,
    backgroundColor:'orange',
    flex: 1
  },
  stretch:{width:50,height:50,
    resizeMode:'stretch',},
    row:{
    backgroundColor:'#fff',
    
    borderBottomWidth:4,
    }
  })
export default App

【问题讨论】:

    标签: android react-native google-cloud-firestore react-native-android react-native-firebase


    【解决方案1】:

    图像路径必须转换为&lt;Image/&gt; 组件可以获取和显示的URL。这种异步操作最好在组件生命周期内完成一次,并存储在状态中。

    class App extends Component {
        state = {
           ...,
           imageUrl: null,
        }
    
        ...
    
        async componentDidMount() {
            var imageRef = firebase.storage().ref('erkek.jpg');
            var imageUrl = await imageRef.getDownloadURL();
            this.setState({ imageUrl });
        }
    
        render() {
            ...
            <Image style={styles.stretch} source={{ uri: this.state.imageUrl }}/>
            ...
        }
    }
    

    您还应该确保用户对图像具有读取权限。您可以在 Firebase 安全规则中设置读取和写入权限,请参阅 https://firebase.google.com/docs/storage/security/start#sample-rules。如果您希望每个人都可以阅读图像,请在您的规则中设置".read": true,但请注意不要将write 设置为公开,以防止对您的项目进行不必要的篡改!

    【讨论】:

    • @Stayheuh 如果答案解决了您的问题,请接受 - 请参阅 What should I do when someone answers my question?
    • 我几乎做到了,谢谢你,但由于那些阅读规则,我无法在应用程序上显示它。请求到达火力基地,我可以在统计数据中看到。但是没有图像..请稍作帮助,然后我就可以走了。
    • 好的,现在可以了!!!!这次我正确地改变了规则。感谢您的努力:)
    • 太棒了!还有一件事:根据您的规则,任何人都可以向您的项目写入任何内容(删除、创建文件等...)。你永远不应该给公共写权限!将“allow read,write: true”行改为两行:“allow read: true”和“allow write: false”。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2018-09-29
    • 2020-11-25
    相关资源
    最近更新 更多