如何将图像上传到 Firebase 存储并将其添加到数据库中?

Posted

技术标签:

【中文标题】如何将图像上传到 Firebase 存储并将其添加到数据库中?【英文标题】:How can I upload an image to firebase storage and add it to the database? 【发布时间】:2019-10-18 08:39:42 【问题描述】:

我是 Vuejs 的新手。我想要一个表格,您可以使用它来添加产品。产品图片进入 Firebase 存储,但我如何将该图片与数据库中的确切产品相关联?

我已经设置了我的表单,并创建了两个方法。 saveProduct() 将产品保存到数据库中,onFilePicked() 用于监听输入字段中的更改并定位图像并将其上传到存储中。

import  fb, db  from '../firebaseinit'
export default 
  name: 'addProduct',
  data () 
    return 
      product_id: null,
      name: null,
      desc: null,
      category: null,
      brand: null,
      image: null,
    
  , 
  methods: 
    saveProduct () 
      db.collection('products').add(
        product_id: this.product_id,
        name: this.name,
        desc: this.desc,
        category: this.category,
        brand: this.brand
      )
      .then(docRef => 
        this.$router.push('/fsbo/produkten')    
      )

    ,
    onFilePicked (event) 
      let imageFile = event.target.files[0]
      let storageRef = fb.storage().ref('products/' + imageFile.name)
      storageRef.put(imageFile)
      
  

【问题讨论】:

【参考方案1】:

怎么样,你可以使用文件名,你的图片将在你的产品集合中作为somefireurl.com/your_file_name 提供,你可以有一个带有imageFile.name 的图片道具。

 methods: 
    saveProduct (image = null) 
      let productRef = db.collection('products').doc(this.product_id)
      const payload = 
        product_id: this.product_id,
        name: this.name,
        desc: this.desc,
        category: this.category,
        brand: this.brand
      
      if (image) payload['image'] = image
      return productRef
      .set(payload, merge: true)
      .then(docRef => 
        this.$router.push('/fsbo/produkten')    
      )

    ,
    onFilePicked (event) 
      let imageFile = event.target.files[0]
      let storageRef = fb.storage().ref('products/' + imageFile.name)
      storageRef.put(imageFile)
      return this.saveProduct(imageFile.name)
      
  

这应该足以让你开始,也许你想尝试不同的组合,或者你不想像我设置的那样调用 saveProduct,这取决于你的用例,但想法是一样的。希望对你有帮助

【讨论】:

嗨,谢谢你帮助我。但我得到 productRef.set(..) 不是一个奇怪的函数 我可以看看db 的样子吗?它应该类似于const db = admin.firestore(),其中 admin 是您的 firebase 实例 我有以下内容: import firebase from 'firebase' import 'firebase/firestore' import firebaseConfig from './firebaseConfig' import 'firebase/storage' const fb = firebase.initializeApp(firebaseConfig) const db = firebase.firestore();导出 fb, db 起来!我错过了 doc id,你让 firebase 为你设置 doc id,你在这里有几个选项,更改集以添加,甚至更好,请参阅我的更新示例 嗨,很抱歉反应迟了。 return productRef.add(payload, merge: true) 当我这样做时,我收到一个错误 CollectionReference.add() 需要 1 个参数,但是用 2 个参数调用。【参考方案2】:

我自己修好了。这是我的解决方案。我不知道它在技术上是否正确,但它适用于我的用例。

methods: 
saveProduct () 
  let imageFile
  let imageFileName
  let ext 
  let imageUrl
  let key
  let task
  db.collection('products').add(
    product_id: this.product_id,
    name: this.name,
    desc: this.desc,
    category: this.category,
    brand: this.brand
  )
  .then(docRef => 
    key = docRef.id
    this.$router.push('/fsbo/produkten')
    return key    
  )
  .then(key => 
    if(this.image !== null) 
      this.onFilePicked
      imageFile = this.image
      imageFileName = imageFile.name
      ext = imageFileName.slice(imageFileName.lastIndexOf('.'))
    
    let storageRef = fb.storage().ref('products/' + key + '.' + ext)
    let uploadTask = storageRef.put(imageFile)
    uploadTask.on('state_changed', (snapshot) => , (error) => 
      // Handle unsuccessful uploads
    , () => 
      uploadTask.snapshot.ref.getDownloadURL().then( (downloadURL) => 
        db.collection('products').doc(key).update( imageUrl: downloadURL)
      );
    );     
  )    
,
onFilePicked (event) 
  return this.image = event.target.files[0]
  

【讨论】:

以上是关于如何将图像上传到 Firebase 存储并将其添加到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像上传到firebase存储然后将图像url存储在firestore中?

如何将图像从颤动的资产上传到firebase存储?

Flutter - 将图像上传到 Firebase 存储

如何以BLOB格式将图像上传到Firebase存储?

如何将从firebase存储上传的图像保存到firestore数据库中的currentUser

将图像上传到不同大小的 Firebase 存储