2016-05-22 25 views
8

Sto cercando di ottenere il "link di download permanente a lungo termine" per i file nel bucket di archiviazione Firebase. Ho cambiato i permessi di questo perFirebase getDownloadURL

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

E il mio JAVACODE assomiglia a questo:

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; 
} 

Quando eseguo questo ho l'uri link che assomiglia com.google. [email protected]

domanda 1. Posso ottenere da questo il link di download simile a: https://firebasestorage.googleapis.com/v0/b/project-xxxx.appspot.com/o/20-5-2016.csv?alt=media&token=b5d45a7f-3ab7-4f9b-b661-3a2187adxxxx

Quando si cerca di ottenere il link qui sopra ho cambiato l'ultima riga prima del mio ritorno, come questo:

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; 
} 

Ma quando si fa questo ricevo un errore 403, e l'applicazione crash. La console mi dice che questo utente è bc non registrato/auth. "Effettuare l'accesso prima di chiedere il token" Domanda 2. Come posso risolvere questo problema?

Cheers!

risposta

11

Quando si chiama getDownloadUrl(), la chiamata è asincrona e si deve iscriversi in un callback successo per ottenere i risultati:

// 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 
     } 
    }); 
} 

Ciò restituirà un unguessable URL per il download pubblico. Se hai appena caricato un file, questo URL pubblico sarà nella callback di successo del caricamento (non è necessario chiamare un altro metodo asincrono dopo il caricamento).

Tuttavia, se tutto ciò che si desidera è una rappresentazione in formato stringa del riferimento, è sufficiente chiamare .toString().

// 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

Utilizzando l'Async, sembra che si stia verificando un errore con .addSuccessListener (Impossibile risolvere il metodo). Inoltre, quando io nel metodo onSuccess uso qualcosa come link = downloadUrl.toString() dice che deve essere definitivo. Qualsiasi ulteriore assistenza sarebbe fantastica! –

+1

1. Mi spiace, dovrebbe essere addOnSuccessListener (typo) 2. quando ottieni un errore "deve essere definitivo" in java significa che c'è un problema di chiusura. Vedi http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen per maggiori informazioni. Fondamentalmente, la risposta breve è, definire la variabile "link" come membro della classe e dovrebbe andare bene. –

+1

Ha funzionato come uno sharm dopo alcune modifiche! Grazie per l'aiuto! –