将图像存储在 Firebase Storage 中并将元数据保存在 Firebase Cloud Firestore(测试版)中

Posted

技术标签:

【中文标题】将图像存储在 Firebase Storage 中并将元数据保存在 Firebase Cloud Firestore(测试版)中【英文标题】:Store image in Firebase Storage and save metadata in Firebase Cloud Firestore (Beta) 【发布时间】:2018-04-13 19:08:55 【问题描述】:

我正在尝试将图像上传到 Firebase 存储并将一些特定元数据保存到 Firebase Cloud。 我正在用 javascript 编码。

目标是为 Firebase Cloud 设置自定义元数据,例如从用户必须填写的文本输入字段。

这就是我将图像存储到 Firebase 存储的方式:

storageRef.child('images/' + file.name).put(file, metadata).then(function(snapshot) 
        console.log('Uploaded', snapshot.totalBytes, 'bytes.');
        console.log(snapshot.metadata);
        var url = snapshot.downloadURL;
        console.log('File available at', url);
        // [START_EXCLUDE]
        document.getElementById('linkbox').innerhtml = '<a href="' +  url + '">Click For File</a>';
        // [END_EXCLUDE]
      ).catch(function(error) 
        // [START onfailure]
        console.error('Upload failed:', error);
        // [END onfailure]
      );
      // [END oncomplete]
    

我不知道如何在上传功能中集成另一个任务以将元数据写入 Firebase Cloud。 任何帮助将不胜感激!

@eykjs @Sam Storie:感谢您的帮助。 我改变了我的代码。现在,有一个我无法弄清楚的错误,是什么问题。 错误:TypeError: undefined is not an object (evalating 'selectedFile.name')

我的代码:

var selectedFile;

function handleFileSelect(event) 
	//$(".upload-group").show();
	selectedFile = event.target.files[0];
;

function confirmUpload() 
	var metadata = 
		contentType: 'image',
		customMetadata: 
			'dogType': 'Lab',
			'title': $("#imgTitle").val(),
			'caption': $("#imgDesc").val()
		,
	;
	var uploadTask = firebase.storage().ref().child('dogImages/' + selectedFile.name).put(selectedFile, metadata);
		uploadTask.on('state_changed', function(snapshot)
  		
	, function(error) 
  	
	 );

我的 selectedFile 定义有什么问题? 非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

也许您可以在完成上传后将数据上传到 Firestore。

storageRef.child('images/' + file.name).put(file, metadata).then(function(snapshot) 
console.log('Uploaded', snapshot.totalBytes, 'bytes.');

let db = firebase.firestore();
let dbRef = db.collection("images").doc(file.name);

let setData = dbRef.set(
    //yourdata here
    downloadURl: snapshot.downloadURL
).then( () => 
    console.log("Data stored in Firestore!");
);

// your actions

【讨论】:

【参考方案2】:

如果我了解您的需求,那么应该可以使用 Firebase 函数轻松完成:

https://firebase.google.com/docs/storage/extend-with-functions

您可以在存储中的某些内容发生变化时触发函数,从而轻松地将数据写入实时数据库或新的(er)Firestore 数据库。

这是我引用的页面中的一个简单的 sn-p,看看它可能是什么样子:

exports.generateThumbnail = functions.storage.object().onChange(event => 
  // ...
);

【讨论】:

【参考方案3】:

来源Link

Firestore 中上传图片并将元信息保存在 Cloud Storage

import  AngularFireStorage, AngularFireUploadTask  from '@angular/fire/storage';
import  AngularFirestore, AngularFirestoreCollection  from '@angular/fire/firestore';
import  Observable  from 'rxjs';
import  finalize, tap  from 'rxjs/operators';

...
...
...

// The main task
this.task = this.storage.upload(path, file,  customMetadata );

// Get file progress percentage
this.percentage = this.task.percentageChanges();
this.snapshot = this.task.snapshotChanges().pipe(

  finalize(() => 
    // Get uploaded file storage path
    this.UploadedFileURL = fileRef.getDownloadURL();

    this.UploadedFileURL.subscribe(resp=>
      this.addImagetoDB(
        name: file.name,
        filepath: resp,
        size: this.fileSize
      );
      this.isUploading = false;
      this.isUploaded = true;
    ,error=>
      console.error(error);
    )
  ),
  tap(snap => 
      this.fileSize = snap.totalBytes;
  )
)

【讨论】:

以上是关于将图像存储在 Firebase Storage 中并将元数据保存在 Firebase Cloud Firestore(测试版)中的主要内容,如果未能解决你的问题,请参考以下文章

从 Expo 的缓存中以 base64 格式读取文件,写入 Firebase 存储(Cloud Storage for Firebase)

如何将视频上传到Firebase Storage for React App

如何将视频上传到 Firebase Storage for React App

将图像从 ReactJS 上传到 Firebase v9 存储

Firebase Storage Flutter 显示图像加载时间过长

如何从离子3中的firebase-storage获取图像