Android Firebase:如何在上载文件之前检查文件是否已存在
我使用firebase存储进行云存储 上传文件时,如果文件已经存在于存储引用中,我不想上传。我只需要跳过上传,继续下一个文件 现在我像这样上传Android Firebase:如何在上载文件之前检查文件是否已存在,android,firebase,Android,Firebase,我使用firebase存储进行云存储 上传文件时,如果文件已经存在于存储引用中,我不想上传。我只需要跳过上传,继续下一个文件 现在我像这样上传 String pathString = "/Files/" + filename; StorageReference filepathReference = rootreference.child(pathString); StorageReference uploadRef = f
String pathString = "/Files/" + filename;
StorageReference filepathReference = rootreference.child(pathString);
StorageReference uploadRef = filepathReference.child(pathString);
UploadTask uploadTask = uploadRef.putFile(file);
显然,如果文件已经存在,请再次上传并替换。我只想通过检查存储桶中已经存在的文件名来跳过不需要的上传。
可能吗 firebase中没有像现在这样的功能,但您可以通过将文件名保存在数据库中手动完成。上传前,您可以检查文件名是否存在。您可以使用firestore执行此操作 这是为了检查图像是否存在
DocumentReference docRef = db.collection("images").document("file1");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
// your code for uploading next image
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
// your code for uploading this image
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
DocumentReference docRef=db.collection(“图像”).document(“文件1”);
docRef.get().addOnCompletListener(新的OnCompletListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
DocumentSnapshot document=task.getResult();
if(document.exists()){
//上传下一张图片的代码
Log.d(标记“DocumentSnapshot data:+document.getData());
}否则{
//您上传此图像的代码
日志d(标签“无此类文件”);
}
}否则{
Log.d(标记“get failed with”,task.getException());
}
}
});
这用于将文件名保存到数据库
Map<String, Object> image = new HashMap<>();
image.put("name", "file1");
db.collection("images").document("file1")
.set(image)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully written!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error writing document", e);
}
});
Map image=newhashmap();
图像。放置(“名称”、“文件1”);
db.集合(“图像”).文档(“文件1”)
.set(图像)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
Log.d(标记“DocumentSnapshot已成功写入!”);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“错误写入文件”,e);
}
});
firebase中没有像现在这样的功能,但您可以通过将文件名保存在数据库中手动完成。上传前,您可以检查文件名是否存在。您可以使用firestore执行此操作
这是为了检查图像是否存在
DocumentReference docRef = db.collection("images").document("file1");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
// your code for uploading next image
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
// your code for uploading this image
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
DocumentReference docRef=db.collection(“图像”).document(“文件1”);
docRef.get().addOnCompletListener(新的OnCompletListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
DocumentSnapshot document=task.getResult();
if(document.exists()){
//上传下一张图片的代码
Log.d(标记“DocumentSnapshot data:+document.getData());
}否则{
//您上传此图像的代码
日志d(标签“无此类文件”);
}
}否则{
Log.d(标记“get failed with”,task.getException());
}
}
});
这用于将文件名保存到数据库
Map<String, Object> image = new HashMap<>();
image.put("name", "file1");
db.collection("images").document("file1")
.set(image)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully written!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error writing document", e);
}
});
Map image=newhashmap();
图像。放置(“名称”、“文件1”);
db.集合(“图像”).文档(“文件1”)
.set(图像)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
Log.d(标记“DocumentSnapshot已成功写入!”);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“错误写入文件”,e);
}
});
尝试获取元数据。如果失败,则文件不存在
uploadRef.getMetadata()
.addOnSuccessListener({ /*File exists*/ })
.addOnFailureListener({
//File do not exist
UploadTask uploadTask = uploadRef.putFile(file);
})
如果您想完全禁止文件覆盖,而不仅仅是检查文件是否存在,您可以像这样为存储指定安全规则
allow write: if resource.metadata == null; //
但是我从来没有测试过它,所以我不确定它,也许只要
resource==null
也能工作尝试获取元数据。如果失败,则文件不存在
uploadRef.getMetadata()
.addOnSuccessListener({ /*File exists*/ })
.addOnFailureListener({
//File do not exist
UploadTask uploadTask = uploadRef.putFile(file);
})
如果您想完全禁止文件覆盖,而不仅仅是检查文件是否存在,您可以像这样为存储指定安全规则
allow write: if resource.metadata == null; //
但是我从来没有测试过它,所以我不确定它,可能只是
resource==null
也会起作用应该是注释,在这里你可以用适当的代码解释。他是一个新的贡献者,注释功能对他不开放是的,这会增加不必要的代码和开销,此外,数据库流量成本更高我曾尝试过这种方法,但速度很慢,因为@Dima说这种方法太贵了,应该是注释,在这里你可以用适当的代码解释。他是一个新的贡献者,注释功能对他不开放是的,这将增加不必要的代码和开销,此外,数据库流量成本更高。我曾尝试过这种方法,但速度很慢,因为@Dima说这种方法非常昂贵,而且工作正常。非常感谢。在这里,所有上传任务都需要额外的网络请求。首先检查元数据,然后检查实际上载。是否有任何选项可供我在上传请求中设置条件,如果存在,则跳过该文件并获得成功结果?@doe您可以实际指定安全规则,以便无法覆盖该文件,是否需要一个示例?在这种情况下,上传任务就会失败。如果你能在答案中添加一个例子,那就太好了@能源部补充道example@doe是的,它应该在故障监听器中显式地为您提供SecurityException
,它工作正常。非常感谢。在这里,所有上传任务都需要额外的网络请求。首先检查元数据,然后检查实际上载。是否有任何选项可以设置标准