Java 如何从firebase存储中获取由于文件大小限制规则而被拒绝的upolad错误

Java 如何从firebase存储中获取由于文件大小限制规则而被拒绝的upolad错误,java,android,firebase,firebase-storage,firebase-security,Java,Android,Firebase,Firebase Storage,Firebase Security,我在firebase存储中设置了一条规则,限制用户上传不超过20MB的文件 service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow write: if request.auth !=null; allow read: if request.auth !=null

我在firebase存储中设置了一条规则,限制用户上传不超过20MB的文件

service firebase.storage {
          match /b/{bucket}/o {
          match /{allPaths=**} {
                     allow write: if request.auth !=null;
                     allow read: if  request.auth !=null
                                      && request.resource.size < 20 * 1024 * 1024;
                               }
                              }
                          }
service firebase.storage{
匹配/b/{bucket}/o{
匹配/{allpath=**}{
允许写入:if request.auth!=null;
允许读取:if request.auth!=null
&&request.resource.size<20*1024*1024;
}
}
}
这可以正常工作,但问题是当视频由于超出限制而被服务器拒绝时,没有侦听器可以获取该消息或错误

我尝试了下列方法,但没有成功

       UploadTask uploadTask = FirebaseStorage.getInstance().getReference()
                .child("VideoText")
                .child(VideoIdentifire)
                .putFile(SendVideo);
        uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(@NonNull UploadTask.TaskSnapshot taskSnapshot) {

                long progress = 0;
                progress = (long) (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();

                Toast.makeText(getContext(), "Uploading is " + progress + "% done", Toast.LENGTH_LONG).show();

                 }
              })

                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                        Toast.makeText(getContext(), "Fail" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnCanceledListener(new OnCanceledListener() {
                    @Override
                    public void onCanceled() {

                        Toast.makeText(getContext(), "cancel", Toast.LENGTH_SHORT).show();
                    }
                })

                .addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onPaused(@NonNull UploadTask.TaskSnapshot taskSnapshot) {

                        Toast.makeText(getContext(), "paused", Toast.LENGTH_SHORT).show();

                    }
                })

                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

               }
                });
UploadTask UploadTask=FirebaseStorage.getInstance().getReference()
.child(“视频文本”)
.儿童(视频识别)
.putFile(SendVideo);
uploadTask.addOnProgressListener(新的OnProgressListener(){
@凌驾
public void onProgress(@NonNull UploadTask.TaskSnapshot TaskSnapshot){
长期进展=0;
进度=(长)(100.0*taskSnapshot.GetByTestTransferred())/taskSnapshot.getTotalByteCount();
Toast.makeText(getContext(),“上载为”+进度+%done”,Toast.LENGTH\u LONG.show();
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(getContext(),“Fail”+e.getMessage(),Toast.LENGTH\u SHORT.show();
}
})
.addOnCanceledListener(新的OnCanceledListener(){
@凌驾
已取消的公共无效(){
Toast.makeText(getContext(),“cancel”,Toast.LENGTH_SHORT.show();
}
})
.addOnPausedListener(新的OnPausedListener(){
@凌驾
public void onPaused(@NonNull UploadTask.TaskSnapshot TaskSnapshot){
Toast.makeText(getContext(),“暂停”,Toast.LENGTH_SHORT.show();
}
})
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
}
});

如何解决此问题?

您的规则拒绝对大于20MB的资源执行读取操作,而您的代码正在写入文件。要拒绝写入操作,您还需要将大小检查添加到写入规则中:

允许写入:if request.auth=无效的
&&request.resource.size<20*1024*1024;

1)请编辑问题,以同时显示API调用,该调用返回您添加这些侦听器的
任务。2) 还包括运行此代码时发生的具体情况。文件是否在服务器上写入?有听众打电话吗?哪一行代码没有达到您期望的效果?除非你告诉我们这些事情,否则我们无法确切地知道到底出了什么问题,这使得我们很难提供帮助。@FrankvanPuffelen,基本上上述代码一切正常,但唯一的问题是,我在firebase存储服务器中设置了规则,用户不应上传20MB及以上的文件。当文件被拒绝时,我无法从服务器获取显示拒绝的消息,我尝试了上面的侦听器,但没有一个有效。我希望OnFailureListener返回视频上传失败,但它没有。上传完成/失败时是否会调用任何侦听器(请注意,您的
onSuccess
为空,因此很难发现)?如果没有,你能试着看看这是否至少会触发吗?是的,如果成功调用,我可以从那里获取uri,我已经删除了这里的代码,因为它太长了,如果进程被调用,我可以在上载时监视。谢谢@Frank van Puffelen,我不知道我怎么会错过它。现在,我打电话给你。有趣的是,当规则设置为读而不是写时,为什么文件仍然被服务器拒绝呢。!?对大文件的读取将按照您的原始规则被拒绝,而写入则不会。
 allow write: if request.auth !=null;
                  && request.resource.size < 20 * 1024 * 1024;