在Firebase上传图片后,如何获取URL?

33

现在,我正在使用以下代码从Firebase的存储中获取图像:

mStoreRef.child("photos/" + model.getBase64Image())
          .getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            // Got the download URL for 'photos/profile.png'

                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception exception) {
                            // Handle any errors
                            Toast.makeTextthis, "image not dowloaded", Toast.LENGTH_SHORT).show();
                        }
                    });

如何获取此URL?

是否有可能获取此图片中显示的URL?


1
在上传新图像到Firebase时,将图像路径存储到新的子节点中,并从该子节点访问图像URL。https://dev59.com/11oU5IYBdhLWcg3wjHdL - Ganesh Gudghe
你发布的代码就是实现这个功能的代码。这里有什么问题吗?那段代码不能正常工作吗? - Mike McDonald
1
那段代码正常工作,但是当添加新图片时,该图片无法加载到我的图像视图中。 - Rajesh Satvara
这不是你要问的问题 :) 我建议你看看https://github.com/firebase/FirebaseUI-Android/tree/master/storage - Mike McDonald
如果我上传文件时没有保存下载链接,我该如何获取它?我已经知道了文件路径,例如“images/userkey/myimage.png”...有什么建议吗? - user2399432
此问题已在此处得到解答: https://stackoverflow.com/a/52123568/11332070 - MalyckUsman
12个回答

22

请点击以下链接 - https://firebase.google.com/docs/storage/android/download-files#download_data_via_url

    storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            // Got the download URL for 'users/me/profile.png'
            Uri downloadUri = taskSnapshot.getMetadata().getDownloadUrl();
            generatedFilePath = downloadUri.toString(); /// The string(file link) that you need
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
        }
    });

21
"getDownloadUrl()"现已过时。 - MuhammadAliJr
@MuhammadAliJr,那么现在的代码是什么?你找到它了吗? - RodParedes

10

根据最新的Firebase更改,这里是更新后的代码:

File file = new File(String.valueOf(imageUri));         
FirebaseStorage storage = FirebaseStorage.getInstance();        
StorageReference storageRef = storage.getReference().child("images");

storageRef.child(file.getName()).putFile(imageUri)
    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            pd.dismiss();
            Toast.makeText(MyProfile.this, "Image Uploaded Successfully", Toast.LENGTH_SHORT).show();
            Task<Uri> downloadUri = taskSnapshot.getStorage().getDownloadUrl();

           if(downloadUri.isSuccessful()){
            String generatedFilePath = downloadUri.getResult().toString();
            System.out.println("## Stored path is "+generatedFilePath);
        }}
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            pd.dismiss();                     
        }
    });

}

8
这就是我在Kotlin Android中获取下载链接的方法。
 ref.putFile(filePath!!)
            .addOnSuccessListener {

                val result = it.metadata!!.reference!!.downloadUrl;
                result.addOnSuccessListener {

                   var imageLink = it.toString()


                }
            }

7

这在最新的 Firebase 构建中运行良好。

UploadTask uploadTask = ref.putBytes(data);
uploadTask.addOnSuccessListener(new OnSuccessListener<TaskSnapshot>() {

        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(
                    new OnCompleteListener<Uri>() {

                           @Override
                            public void onComplete(@NonNull Task<Uri> task) {
                            String fileLink = task.getResult().toString();
                            //next work with URL

                            }
                        });

6

上述方法taskSnapshot.getMetadata().getDownloadUrl();已经被弃用,替代方法如下:substitute

final StorageReference ref = storageRef.child("images/mountains.jpg");
uploadTask = ref.putFile(file);

Task<Uri> urlTask = uploadTask.continueWithTask(new 
  Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
     @Override
      public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
    if (!task.isSuccessful()) {
        throw task.getException();
    }

    // Continue with the task to get the download URL
    return ref.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
    if (task.isSuccessful()) {
        Uri downloadUri = task.getResult();
    } else {
        // Handle failures
        // ...
    }
  }
});

非常好,这个方法解决了我遇到的问题。我已经困扰了两天了,你真是太棒了。 - Najaf Ali
@Tupio,我可以在GridView中使用这个吗?https://dev59.com/jbzpa4cB1Zd3GeqPSNGe - Kingg

5

以前的Firebase使用 getMetadata().getDownloadUrl(),而今天他们使用 getDownloadUrl()

应该这样使用:

.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        String image = taskSnapshot.getDownloadUrl().toString());
    }
});

之前的回答已经过时了,这个回答是否正确并且您仍然需要一个描述? - Raphael Ramos
本网站旨在用于学习目的。添加一般性解释,例如:为什么它比以前的更好或者如何回答这个问题。通常不附加解释的代码会导致某些人对其进行负面评价,即使答案是正确的。 - SHR
很抱歉,这里没有太多的解释,只是在使用 Firebase 之前需要使用 getMetadata().getDownloadUrl(),而今天直接使用 getDownloadUrl()。 - Raphael Ramos
这应该在答案描述中。算了,我自己编辑了它。 - SHR

1
 //kotlin

var uri:Uri
    uploadTask.addOnSuccessListener {t ->
        t.metadata!!.reference!!.downloadUrl.addOnCompleteListener{task ->
            uri = task.result!!

        }
    }

0

这应该是在 Kotlin 中完成的方式 你需要添加一个 onCompleteListener

putFile(file).addOnSuccessListener {

            it.storage.downloadUrl.addOnCompleteListener {
            //then you can call it.result.toString()
            }
}

0

是的,这是可能的!!。 不需要一些令人毛骨悚然的复杂代码,我有一个快捷技巧可以在 Kotlin 中从 Firebase 存储获取下载 URL。

注意:基于最新的 Firebase 发布,没有 getdownloadurl()getresult() 方法(它们是这次淘汰的猎物)

所以我在这里使用的技巧是通过从 taskSnapshot 对象 调用 UploadSessionUri,它会返回下载 URL 以及上传类型、tokenid(仅在较短时间内可用)和其他一些东西。

由于我们只需要下载 URL,因此我们可以使用子字符串来获取下载 URL,并将其与 alt=media 连接起来以查看图像。

var du:String?=null
var du1:String?=null
var du3:String="&alt=media"
val storage= FirebaseStorage.getInstance()
        var storagRef=storage.getReferenceFromUrl("gs://hola.appspot.com/")
        val df= SimpleDateFormat("ddMMyyHHmmss")
        val dataobj= Date()
        val imagepath=SplitString(myemail!!)+"_"+df.format(dataobj)+".jpg"
        val imageRef=storagRef.child("imagesPost/"+imagepath)
        val baos= ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos)
        val data=baos.toByteArray()
        val uploadTask=imageRef.putBytes(data)
        uploadTask.addOnFailureListener{
            Toast.makeText(applicationContext,"Failed To Upload", Toast.LENGTH_LONG).show()
        }.addOnSuccessListener { taskSnapshot ->
            imageRef.downloadUrl.addOnCompleteListener (){
                du=taskSnapshot.uploadSessionUri.toString()
                du1=du!!.substring(0,du!!.indexOf("&uploadType"))
                downloadurl=du1+du3
                Toast.makeText(applicationContext,"url"+downloadurl, Toast.LENGTH_LONG).show()
            }
        }

希望能有所帮助!

0

我尝试过这个,它给了我在图像视图上进行审查的链接:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接