将自定义数据添加到firebase存储上传?

时间:2018-01-01 07:22:56

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

我正在将文件上传到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中返回undefined)

不确定我是如何实现这一目标的......

3 个答案:

答案 0 :(得分:4)

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

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

您可以使用存储触发器访问此元数据并相应地执行操作。以下是如何实现Automatically Extract Images Metadata

的方法

答案 1 :(得分:1)

我相信有些属性无法更改,因为它们不可写。但是,如果确实要将自定义数据添加到firebase存储,则可以将自定义元数据设置为包含String属性的对象。例如:

> btest2 <- glm(var5 ~ var1 + var3 + var2 + var4, data = btest, family = 'binomial')
> btest2$terms
var5 ~ var1 + var3 + var2 + var4
attr(,"variables")
list(var5, var1, var3, var2, var4)
attr(,"factors")
     var1 var3 var2 var4
var5    0    0    0    0
var1    1    0    0    0
var3    0    1    0    0
var2    0    0    1    0
var4    0    0    0    1
attr(,"term.labels")
[1] "var1" "var3" "var2" "var4"
attr(,"order")
[1] 1 1 1 1
attr(,"intercept")
[1] 1
attr(,"response")
[1] 1
attr(,".Environment")
<environment: R_GlobalEnv>
attr(,"predvars")
list(var5, var1, var3, var2, var4)
attr(,"dataClasses")
     var5      var1      var3      var2      var4 
 "factor" "numeric"  "factor"  "factor" "numeric" 
> attr(btest2$terms, 'dataClasses')
     var5      var1      var3      var2      var4 
 "factor" "numeric"  "factor"  "factor" "numeric" 

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

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

例如:

使用downloadUrl:

获取对图像文件的引用   
 var myCustomMetadata = {
    customMetadata : {
     'file_name': 'this is the file name'
     }
   }

使用引用更新元数据:

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

答案 2 :(得分:-1)

对我来说,我不得不调用 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);
    }