Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase:如何在上载文件之前检查文件是否已存在_Android_Firebase - Fatal编程技术网

Android Firebase:如何在上载文件之前检查文件是否已存在

Android Firebase:如何在上载文件之前检查文件是否已存在,android,firebase,Android,Firebase,我使用firebase存储进行云存储 上传文件时,如果文件已经存在于存储引用中,我不想上传。我只需要跳过上传,继续下一个文件 现在我像这样上传 String pathString = "/Files/" + filename; StorageReference filepathReference = rootreference.child(pathString); StorageReference uploadRef = f

我使用firebase存储进行云存储

上传文件时,如果文件已经存在于存储引用中,我不想上传。我只需要跳过上传,继续下一个文件

现在我像这样上传

    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
,它工作正常。非常感谢。在这里,所有上传任务都需要额外的网络请求。首先检查元数据,然后检查实际上载。是否有任何选项可以设置标准