2016-05-22 11 views
8

Ich versuche, den "dauerhaften Langzeit-Download-Link" zu Dateien in unserem Firebase Storage-Bucket zu bekommen. Ich habe die Berechtigungen dies zuFirebase getDownloadURL

geändert
service firebase.storage { 
    match /b/project-xxx.appspot.com/o { 
    match /{allPaths=**} { 
     allow read, write; 
    } 
    } 
} 

Und mein javacode sieht wie folgt aus:

private String niceLink (String date){ 
    String link; 
    // Points to the root reference 
    StorageReference storageRef = FirebaseStorage.getInstance().getReference(); 
    StorageReference dateRef = storageRef.child("/" + date+ ".csv"); 
    link = dateRef.getDownloadUrl().toString(); 
    return link; 
} 

Als ich dies laufe ich die uri link bekommen, die so etwas wie com.google aussieht. [email protected]

Frage 1. Kann ich daraus den Download-Link kompatibel zu: https://firebasestorage.googleapis.com/v0/b/project-xxxx.appspot.com/o/20-5-2016.csv?alt=media&token=b5d45a7f-3ab7-4f9b-b661-3a2187adxxxx

Beim Versuch, den Link zu erhalten oben ich die letzte Zeile vor meiner Rückkehr geändert, wie folgt aus:

private String niceLink (String date){ 
    String link; 
    // Points to the root reference 
    StorageReference storageRef = FirebaseStorage.getInstance().getReference(); 
    StorageReference dateRef = storageRef.child("/" + date+ ".csv"); 
    link = dateRef.getDownloadUrl().getResult().toString(); 
    return link; 
} 

Aber wenn dies zu tun bekomme ich einen 403-Fehler, und die App abstürzt. Die Konsole sagt mir, dies ist bc Benutzer ist nicht angemeldet/auth. "Bitte anmelden, bevor nach Token gefragt wird" Frage 2. Wie behebe ich das Problem?

Prost!

Antwort

11

Wenn Sie getDownloadUrl() aufrufen, der Aufruf ist asynchron und Sie müssen auf einen Erfolg Rückruf abonnieren, um die Ergebnisse zu erhalten:

// Calls the server to securely obtain an unguessable download Url 
private void getUrlAsync (String date){ 
    // Points to the root reference 
    StorageReference storageRef = FirebaseStorage.getInstance().getReference(); 
    StorageReference dateRef = storageRef.child("/" + date+ ".csv"); 
    dateRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() 
    { 
     @Override 
     public void onSuccess(Uri downloadUrl) 
     {     
      //do something with downloadurl 
     } 
    }); 
} 

Dies wird eine öffentliche unguessable Download-URL zurück. Wenn Sie gerade eine Datei hochgeladen haben, befindet sich diese öffentliche URL im Erfolgsrückruf des Uploads (Sie müssen nach dem Hochladen keine andere Async-Methode aufrufen).

Wenn Sie jedoch nur eine Zeichenfolgendarstellung der Referenz verwenden möchten, können Sie einfach .toString() aufrufen.

// Returns a Uri of the form gs://bucket/path that can be used 
// in future calls to getReferenceFromUrl to perform additional 
// actions 
private String niceRefLink (String date){ 
    // Points to the root reference 
    StorageReference storageRef = FirebaseStorage.getInstance().getReference(); 
    StorageReference dateRef = storageRef.child("/" + date+ ".csv"); 
    return dateRef.toString(); 
} 
+1

Unter Verwendung der Async scheine ich auch einen Fehler mit dem .addSuccessListener zu erhalten (Methode kann nicht aufgelöst werden). Darüber hinaus, wenn ich in der onSuccess-Methode etwas wie link = downloadUrl.toString() verwenden, heißt es, es muss endgültig sein. Jede weitere Hilfe wäre super! –

+1

1. Entschuldigung, das sollte addOnSuccessListener (typo) sein 2. Wenn Sie einen Fehler erhalten "muss endgültig sein" in Java bedeutet es, dass es ein Schließungsproblem ist. Siehe http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen für weitere Informationen. Grundsätzlich ist die kurze Antwort, definieren Sie die "Link" Variable als ein Klassenmitglied und es sollte in Ordnung sein. –

+1

Arbeitete wie ein Sharm nach einigen Änderungen! Danke für die Hilfe! –