【问题标题】:Adding custom data to a firebase storage upload?将自定义数据添加到 Firebase 存储上传?
【发布时间】:2018-06-11 09:15:35
【问题描述】:

我正在像这样将文件上传到 Firebase 存储:

var storageRef = firebase.storage();
                var fileRef = storageRef.ref(file.name);
                fileRef.put(file)
                    .then(function (snapshot) {
                        console.log('Uploaded a blob or file!');
                        window.URL.revokeObjectURL(file.preview);
                    })

上传后我有一个 Firebase 存储触发器:

export const processUploadedFile = functions.storage.object().onChange(event => {
}

我想要做的是在原始上传时上传一些附加信息,以便 processUploadedFile 知道如何处理它(例如提取文件,将其移动到特殊目录等)。

我尝试像这样使用元数据:

        var newMetadata = {
            customMetadata: {
                "Test": "value"
            }
        }

fileRef.put(file, newMetadata)

但是在云存储触发功能上我不知道如何获取元数据,我像这样注销了fileMetaData:

file.getMetadata().then((metaData)=>console.log(metaData))

但在其中的任何地方(或返回未定义的 fileMetaData[0].metadata 中)都没有看到我的元数据

不知道我怎么能做到这一点......

【问题讨论】:

    标签: firebase firebase-storage google-cloud-functions


    【解决方案1】:

    我认为提供文件元信息可以解决问题。这是参考。 Firebase Storage File metadata。您可以使用 customMetadata 为文件传递自定义参数。例如:

    customMetadata: {
        'actionType': 'ACTION_CODE',
        'action': 'do something info'
    }
    

    您可以使用存储触发器访问此元数据并采取相应的操作。以下是您如何实现这一目标Automatically Extract Images Metadata

    【讨论】:

    • 我尝试了你的想法,但不确定如何在上传后获取自定义元数据,我更新了我的问题
    • ah nvm 解决了,看起来我必须像这样转换元数据: var metadata = fileMetaData as FileMetadata console.log(metadata.metadata) // 显示我的东西
    【解决方案2】:

    我相信有些属性不能更改,因为它们不可写。但是,如果您确实想将自定义数据添加到 Firebase 存储,则可以将自定义元数据设置为包含字符串属性的对象。例如:

     var myCustomMetadata = {
        customMetadata : {
         'file_name': 'this is the file name'
         }
       }
    

    在上述情况下,file_name 是您要创建的自定义元数据。

    在 firebase 存储中创建对文件的引用后,您可以在引用上调用 updateMetadata() 方法。

    例如:

    使用 downloadUrl 获取对图像文件的引用:

      var getRef = firebase.storage().refFromURL(imageUrl);
    

    使用引用更新元数据:

    getRef.updateMetadata(myCustomMetadata).then(()=>{
        //do other things
      })
    

    【讨论】:

      【解决方案3】:

      对我来说,我不得不调用 Firebase Storage 2x。我在 Android 设备上使用 Java 来编辑元数据。第一次是上传图片。第二次是设置图像的元数据。 设置存储文件元数据的说明在这里=https://firebase.google.com/docs/storage/android/file-metadata

      "文件上传完成后,您可以随时使用 updateMetadata() 方法更新文件元数据。"

      这是我的功能:

          private void uploadImageToFBStorageAndFS(byte[] profilePic, final StorageUrlEstablished_CL storageUrlCallback) {
              String storage_directory =  //You get this
              StorageReference profileImageRef = FirebaseStorage.getInstance().getReference(storage_directory).child(final_filename);
          
         //1st time, upload the image/bytes.
              if (profilePic != null) {
                  profileImageRef.putBytes(profilePic).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                      @Override
                      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                          Task<Uri> result = taskSnapshot.getMetadata().getReference().getDownloadUrl();
                          result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                              @Override
                              public void onSuccess(Uri uri) {
                                  updateImageMetadata(profileImageRef);
          
                                  String urlWhereProfilePicIsStored = uri.toString();
                               }
                          });
                      }
                  }).addOnFailureListener(new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception e) {
                         //Error handling
                      }
                  });
              }
          }
      
          private void updateImageMetadata(StorageReference profileImageRef){
              //Some devices, like the Asus tablet, doesn't upload good meta-data with the image.
              // Create file metadata including the content type
              StorageMetadata metadata = new StorageMetadata.Builder()
                      .setContentType("image/png")
                      .setCustomMetadata("myCustomProperty", "Rent App")
                      .build();
      
              // Update metadata properties
              profileImageRef.updateMetadata(metadata);
          }
      

      【讨论】:

      • 您似乎在使用 Java。提问者正在使用 Javascript。使用提问者回答问题时使用的相同语言。
      猜你喜欢
      • 2017-01-08
      • 2023-03-06
      • 1970-01-01
      • 2019-10-18
      • 2020-11-17
      • 2017-10-19
      • 2020-10-10
      • 2018-07-06
      • 2017-04-25
      相关资源
      最近更新 更多