上传图片后在 Firebase 中如何获取 Url? [复制]

Posted

技术标签:

【中文标题】上传图片后在 Firebase 中如何获取 Url? [复制]【英文标题】:In Firebase after uploading Image how can I get Url? [duplicate] 【发布时间】:2017-03-03 19:13:03 【问题描述】:

现在,我正在使用以下代码从 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();
                        
                    );

有没有可能得到这个如图所示的网址?

【问题讨论】:

同时在 Firebase 商店图像路径上将新图像上传到新的孩子并访问该孩子的图像 url ***.com/questions/37335102/… 您发布的代码正是执行此操作的代码。这里有问题吗,那个代码不行吗? 该代码工作正常,但是当添加新图像时,该图像未加载到我的图像视图中 这不是你要问的问题 :) 我会看看github.com/firebase/FirebaseUI-android/tree/master/storage 我上传的时候没有保存,怎么获取下载地址?我有像“images/userkey/myimage.png”这样的路径..有什么建议吗? 【参考方案1】:

点击此链接-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
        
    );

【讨论】:

getDownloadUrl() 现已弃用 @MuhammadAliJr 那么,现在的代码是什么?你找到了吗?【参考方案2】:

根据最新的 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();                     
        
    );


【讨论】:

【参考方案3】:

这就是我在 kotlin android 中获取下载链接的方式。

 ref.putFile(filePath!!)
            .addOnSuccessListener 

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

                   var imageLink = it.toString()


                
            

【讨论】:

【参考方案4】:

这在最新的 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

                            
                        );

【讨论】:

【参考方案5】:

过去,firebase 使用getMetadata().getDownloadUrl(),现在他们使用getDownloadUrl()

应该这样使用:

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

【讨论】:

上一个答案已失效,这是帖子的正确答案,您还需要说明吗? 本网站用于学习目的。添加您的答案的一般解释,例如:为什么它比前一个更好或它如何回答问题。通常在没有解释的情况下放一个代码会导致一些人只是投反对票,即使答案是正确的。 这里就不多解释了,不好意思,刚才firebase用getMetadata().getDownloadUrl(),今天直接用getDownloadUrl()。 这应该在答案描述中。没关系,我自己编辑的。【参考方案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
        // ...
    
  
);

【讨论】:

非常棒,这个方法解决了我的问题,我在两天前就遇到了问题,你真的很棒。 @Tupio 我可以在 gridview 中使用它吗? ***.com/questions/63490176/…【参考方案7】:
 //kotlin

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

        
    

【讨论】:

【参考方案8】:

是的,这是可能的! 这里不是一些令人毛骨悚然的复杂代码行,而是我从 kotlin 的 firebase 存储中获取下载 URL 的捷径

注意:基于最新的 firebase 版本,没有 getdownloadurl()getresult() 方法(这一次他们是折旧的猎物)

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

由于我们只需要下载 url,我们可以使用 substring 获取 downloadurl 并将其与 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()
            
        

希望对你有帮助!

【讨论】:

【参考方案9】:

这应该是在kotlin中应该如何完成的 你需要添加一个 onCompleteListener

putFile(file).addOnSuccessListener 

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

【讨论】:

【参考方案10】:

这对我有依赖性 - implementation 'com.google.firebase:firebase-storage:19.1.0'

ref.putFile(iconUriLocalFilePath)
        .addOnSuccessListener(  
            new OnSuccessListener<UploadTask.TaskSnapshot>() 
            @Override
            public void onSuccess(
                    UploadTask.TaskSnapshot taskSnapshot)
            
                Task<Uri> uri = ref.getDownloadUrl();
                String iconPathFirebase = uri.getResult().toString();
            
    );

【讨论】:

你的意思是:Task uri = taskSnapshot.getStorage().getDownloadUrl();【参考方案11】:

我试过了,它给了我在 imageview 上查看它的链接:

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

【讨论】:

【参考方案12】:

如果您已经拥有基于 URL 的下载基础架构,或者只是希望共享一个 URL,则可以通过在存储引用上调用 getDownloadUrl() 方法来获取文件的下载 URL。

// Create a storage reference from our app
val storageRef = storage.reference

 storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener 
            // Got the download URL for 'users/me/profile.png'
        .addOnFailureListener 
            // Handle any errors
        

firebase documentation

【讨论】:

以上是关于上传图片后在 Firebase 中如何获取 Url? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

上传图片后,Vue Firebase 无法获取图片 url

使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase

如何在实时 Firebase 数据库中保存上传图片的完美 url-link?

获取图片 url Firebase 存储(管理员)

如何将 Firebase 上传图片的图片下载 URL 转换为 base64

在ios中上传后如何从firebase获取缩略图?