web-dev-qa-db-ja.com

AndroidアプリケーションからFirebaseストレージにファイルが存在するかどうかを確認する方法は?

開発中Androidアプリケーションがユーザーが画像をクリックすると、Firebaseに保存され、クラウド関数がこの画像を処理して、出力をテキストファイルの形式でFirebaseに保存します。表示するためにAndroidの出力では、アプリケーションは出力ファイルが存在するかどうかをチェックし続けます。存在する場合は、アプリケーションに出力を表示します。存在しない場合は、ファイルが利用可能になるまでファイルを待機する必要があります。

Firebaseにファイルが存在するかどうかを確認するためのドキュメントが見つかりません。ヘルプやポインタが参考になります。

ありがとう。

13

Firebase Storage APIは、ユーザーが存在するファイルのみをリクエストするように設定されています。

したがって、存在しないファイルはエラーとして処理する必要があります。

あなたはドキュメントをチェックすることができます ここ

9
Muhammad Younas

GetDownloadURLを使用してPromiseを返すことができます。Promiseを使用すると、「見つかりません」エラーをキャッチしたり、ファイルが存在する場合はそれを処理したりできます。例えば:

    storageRef.child("file.png").getDownloadURL().then(onResolve, onReject);

function onResolve(foundURL) { 
//stuff 
} 
function onReject(error){ 
//fill not found
console.log(error.code); 
}

更新済み

これは、もう1つのシンプルでクリーンなソリューションです。

storageRef.child("users/me/file.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        // Got the download URL for 'users/me/profile.png'
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // File not found
    }
});
7

ファイルが存在しない場合は StorageException が発生します。ただし、StorageExceptionはさまざまな理由で発生する可能性があり、それぞれに固有のエラーコードがStorageExceptionクラスの定数として定義されています。

ファイルが存在しない場合は、StorageException.ERROR_OBJECT_NOT_FOUNDのエラーコードが表示されます。

ファイルの完全なURL参照がある場合は、次の方法でファイルが存在するかどうかを確認できます。

String url = "https://firebasestorage.googleapis.com/v0/b/******************"
StorageReference ref = FirebaseStorage.getInstance().getReferenceFromUrl(url);

ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        Log.d(LOG_TAG, "File exists");
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        if (exception instanceof StorageException && 
           ((StorageException) exception).getErrorCode() == StorageException.ERROR_OBJECT_NOT_FOUND) {
            Log.d(LOG_TAG, "File not exist");
        }
    }
});

残りのエラーコードは here で確認できます

1
Zain

これの私のコード

 void getReferenceAndLoadNewBackground(String photoName) {
    final StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Photos").child(photoName + ".png");
    storageReference.getDownloadUrl()
            .addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    loadBackground(storageReference);
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    int errorCode = ((StorageException) exception).getErrorCode();
                    if (errorCode == StorageException.ERROR_OBJECT_NOT_FOUND) {
                        StorageReference storageReference2 = FirebaseStorage.getInstance().getReference().child("Photos").child("photo_1.png");
                        loadBackground(storageReference2);
                    }

                }
            });
}
1
Dan Alboteanu

これは現在、ファイルが存在するかどうかを確認する方法です。

This.auth.user $は、FireStoreデータベースから現在のユーザーのデータを表示するオブザーバブルをプルします。 FileStorageプロファイルイメージ参照をFireStoreデータベースに保存します。

次に、ユーザーのデータでファイルパスを使用し、それをFileStorage参照に使用します。

オブザーバブルを使用して、downloadURLの長さが0以下かどうかを確認します。

確かにゼロより大きい場合、ファイルは存在しています。その後、何かを行ってください。他に何か他のことをします。

ngOnInit() {
    this.userSubscription = this.auth.user$.subscribe((x) => {
    console.log(x);
    this.userUID = x.userId;
    this.userPhotoRef = x.appPhotoRef;
    this.userDownloadURL = x.appPhotoURL;
    });
    const storageRef = this.storage.ref(this.userPhotoRef);
    console.log(storageRef);
    if (storageRef.getDownloadURL.length <= 0) {
      console.log('File Does not Exist');
    } else {
      console.log('File Exists');
    }
  }
0