2017-04-26 48 views
3

將文件上傳到Firebase後,如何獲取它的URL以便將其存儲起來以備後用?我想將網址寫入Firebase數據庫,以便其他用戶可以訪問該圖像。如何在將文件上傳到Firebase後獲取文件的URL?

我上傳文件,像這樣:

public void uploadFile() 
{ 

    StorageReference filepath = mstorageRef.child("folder").child(filename); 

    Uri File= Uri.fromFile(new File(mFileName)); 

    filepath.putFile(File).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
     @Override 
     public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
     { 
      Toast.makeText(MtActivity.this, "Upload Done", Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

我已經證實,這些文件其實都是上傳所以現在我只需要我可以寫我的數據庫的URL。然而,當我試圖做到這一點:

Uri downloadUrl = taskSnapshot.getMetadata().getDownloadUrl(); 

它給了我一個錯誤,說This method should only be accessed from tests or within private scope

我不知道這意味着什麼,我也不知道我爲什麼會得到這個錯誤意識我正在關注Firebase提供的this example

有沒有獲取URL的新方法?

此外,該項目特別是該URL是唯一的?這意味着如果我將它存儲到數據庫並且稍後嘗試訪問它,我將能夠做到這一點嗎?

+0

你應該寫'taskSnapshot.getDownloadUrl()',而不是'taskSnapshot.getMetadata( ).getDownloadUrl()' –

+0

@AnggrayudiH我試過了,它給了我同樣的錯誤信息。出於某種原因,它只是不會讓我調用我的'addOnSuccessListener()'方法中的方法。 –

+0

關於你看到的錯誤,你見過[這篇文章](http://stackoverflow.com/q/41105586/4625829)? –

回答

0

你試過taskSnapshot.getDownloadUrl()? 如果這也不起作用,你可以通過mstorageRef.child("folder").child(filename).toString()

+0

我試過'taskSnapshot.getDownloadUrl()',但它給出了同樣的錯誤。另外,我將如何使用您向我展示的另一種方法?另外,其他方法對我來說會怎樣?我將如何獲取文件? –

+0

Url只是firebase的路徑,圖片存儲在上傳成功後,您應該知道存儲上正在創建一個路徑,因此請使用您保存的相同存儲引用o並將其保存爲字符串..在代碼'filepath中。 toString()' – amar

+0

這很有道理。但是如果我在另一項活動中想要訪問該圖片,我該怎麼做?由於我無法訪問'mstorageRef',我將如何訪問圖像? –

0

獲得成功聽者圖像位置試試這個:

final Uri uri = data.getData(); 

StorageReference filepath = mStorageRef.child("folder").child(filename); 
filepath.putFile(uri).addOnSuccessListener(new 

OnSuccessListener<UploadTask.TaskSnapshot>() { 

     @Override 
     public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 

      Uri downloadUri = taskSnapshot.getDownloadUrl(); 
      //Getting url where image is stored 
      //downloadUri will store image URI 
     } 
    }); 
相關問題