0

私はFirebase Storageを使用して画像URLを作成し、Firebaseデータベースに送信しています。私は 'currentUser'とFirebase Storageの両方の子参照がハードコードされているときにうまく動作します。しかし、Firebaseデータベースから実際のcurrentUserを取得し、子参照/参照に流体名を付けるにはどうすればよいですか?私はこれについて、Javaでいくつかの答えを見てきました。しかしJavascriptではない。ここに私のコードです:firebase storage imageのソフトコード化方法url's

// openImage() is the function that grabs a photo from the camera roll 
// I'm using react-native btw, so some of this code is handling the 
// blob. 

openImage() { 
this.setState({ loading: true }); 
const Blob = RNFetchBlob.polyfill.Blob; 
const fs = RNFetchBlob.fs; 
window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest 
window.Blob = Blob 

// if I use this code, it won't return the urls: const {currentUser} 
// = firebase.auth() 

// So, I've got the 'currentUser' hardcoded in as "12345" 

const { currentUser } = "12345" 

// ImagePicker.openPicker() is just a library to access the camera roll 

ImagePicker.openPicker({ 
    width: 400, 
    height: 300, 
    cropping: true, 
    mediaType: 'photo', 
}).then(image => { 
    const imagePath = image.path; 

    let uploadBlob = null; 

    const storage = firebase.storage(); 
    const storageRef = storage.ref(currentUser); 

    //I also have the .child reference name hardcoded as 'dp.jpg'  

    const imageRef = storageRef.child('dp.jpg'); 
    const mime = 'image/jpg'; 
    fs.readFile(imagePath, '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) => { 
     const { image } = this.props; 

     this.props.entryUpdate({ prop: 'image', value: url }) 


    }); 
}); 

}

画像のURL

はその後Firebase、データベースに渡されると「画像」のキーと「dp.jpg」の値として設定されます。ハードコーディングでは、これは正常に動作しますが、1つのイメージと1人のユーザ(またはFirebase Storageのフォルダ)に対してのみです。私はFirebaseリアルタイムデータベースは、のように項目にそれ自身のID番号を割り当てます方法を知っています:。

item.keyがFirebaseによって生成される
const { currentUser } = firebase.auth(); 
const item = firebase.database().ref(`/users/${currentUser.uid}/items`) 
.push(); 
return() => { 
item.set({ make, model, year, uid: item.key, image }) 

、したがってがでハードコードされている必要はありません、それはですイメージの子の名前と 'currentUser'の両方でFirebase Storageでこれを達成することは可能ですか?そして、モバイルアプリだけがデータベースからURLを取得しているので、Firebaseストレージ内の「currentUser」フォルダに各画像を割り当てる必要がありますか?

+0

'.once( 'value')'を 'storage.ref(currentUser)'にチェーンしようとしましたか?または、それが返すものを記録しようとしましたか?ただ仮定します。ドキュメントの例によると、 'const item = firebase.storage()。ref()。child(currentUser)'を実行するべきではありませんか? – parohy

答えて

0

@parohy firebase docsを検索する時間をとってくれてありがとう。 .once()はFirebase Realtime Databaseでのみ動作します。 Firebase Storageで一意の名前を探しています。しかし、あなたの答えは私が私のソリューションに来るのを助けました。私は、Firebase Databaseがすでに完全にユニークなIDを作成しているという事実に着手しようとしていました。しかし、私はFirebase Storageのものにアクセスすることはできないと思います。だから私はちょうどした:

firebase.storage().ref().child(unique + '.jpg') 

const unique = Date.now() + Math.random(); 

完全に一意ではないが、十分に近い。

関連する問題