我正在将文件上传到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)
不确定我是如何实现这一目标的......
答案 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);
}