上传图片后在 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我试过了,它给了我在 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase
如何在实时 Firebase 数据库中保存上传图片的完美 url-link?