当前位置: 首页 > 知识库问答 >
问题:

如何获得多个图像上传到firebase存储的下载URL

孔礼骞
2023-03-14

我将两张“用户选择的”图片上传到firebase存储区,并将它们的URL保存到firestore,但是URL保存指向的只是其中一张图片,尽管它们看起来并不相同。有一个类似的问题,但是关于swift的,它没有回答我的问题,这里是这个问题的URL。从多个文件上传firebase存储获取下载url

我试着用ref.getDownloadURL()获取下载链接,但这给出了错误的URL,TaskSnapshot.getDownloadURL()不再起作用了。我试着阅读了很多答案,但没有任何帮助。大多数已经过时的TaskSnapshot.getDownloadURL()方法。

        if (profileImageUri != null) {

            //upload first image
            profileImageRef.putFile(profileImageUri).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();
                    }
                    return profileImageRef.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        profileImageUrl = String.valueOf(downloadUri);
                        saveUserInfo(); // method to save the URLs along with other info
                    } else {
                        Toast.makeText(EditProfile.this, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                    btSaveInfo.setVisibility(View.VISIBLE);
                    progressBar.setVisibility(View.GONE);
                }
            });
        }

        if (coverImageUri != null) {

            // Upload second image
            profileImageRef.putFile(coverImageUri).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();
                    }
                    return profileImageRef.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {

                    if (task.isSuccessful()) {
                        Uri downloadCUri = task.getResult();
                        coverImageUrl = String.valueOf(downloadCUri);
                        Toast.makeText(getApplicationContext(), "Cover Picture Uploaded", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(EditProfile.this, "Cover picture upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    } 
                }
            });

这两个映像被上传,我可以在我的firebase控制台中看到它们,但是保存在firestore中的URL都加载了相同的映像,虽然它们不一样,

>

  • https://firebasestorage.googleapis.com/v0/b/sefnetapp-39b37.appspot.com/o/profilepics%2f1561103180500.jpg?alt=介质&标记=8dd5ee93-9bbc-46ee-89b9-Fb5ae5b36128

    https://firebasestorage.googleapis.com/v0/b/sefnetapp-39b37.appspot.com/o/profilepics%2f1561103180500.jpg?alt=介质&标记=c153c59b-c6b3-428b-a845-3db3b19a38e3

    我如何获得两个URL来加载我上传的两张图片,而不仅仅是一张

    谢谢你的帮助,非常感谢。

  • 共有1个答案

    吕英豪
    2023-03-14

    我刚刚意识到我没有保存我的信息后上传的封面图像,我添加了saveInfo方法在我的onComplete的封面图像上传方法,它现在工作良好。

        final StorageReference profileImageRef = FirebaseStorage.getInstance()
                    .getReference(SefnetContract.PROFILE_PICS_REF + System.currentTimeMillis() + ".jpg");
    
            // Upload profile picture
            if (profileImageUri != null) {
                progressBar.setVisibility(View.VISIBLE);
                profileImageRef.putFile(profileImageUri).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();
                        }
                        return profileImageRef.getDownloadUrl();
                    }
                }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        if (task.isSuccessful()) {
                            Uri downloadUri = task.getResult();
                            profileImageUrl = String.valueOf(downloadUri);
                            saveUserInfo();
                        } else {
                            Toast.makeText(EditProfile.this, "upload failed: "
                                    + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }
                        progressBar.setVisibility(View.GONE);
                    }
                });
            }
            if (coverImageUri != null) {
                // Upload cover picture
                progressBar.setVisibility(View.VISIBLE);
                profileImageRef.putFile(coverImageUri).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();
                        }
                        return profileImageRef.getDownloadUrl();
                    }
                }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        progressBar.setVisibility(View.GONE);
                        if (task.isSuccessful()) {
                            Uri downloadCUri = task.getResult();
                            coverImageUrl = String.valueOf(downloadCUri);
                            saveUserInfo();
                            Toast.makeText(getApplicationContext(), "Cover Picture Uploaded", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(EditProfile.this, "Cover picture upload failed: "
                                    + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
    

    我还是觉得可以用更好的方法来做,所以如果你知道比这更好的方法,请分享。我想要一个方法,在其中我可以停止用户初始化上传方法太多次,通过单击按钮重复,谢谢

     类似资料:
    • 我试图获得这样的下载网址,但它没有得到正确的网址。我是Firebase的初学者,怎么做呢?

    • 我从Firebase存储中获取图像,用相机拍照,或者从图书馆中挑选一张。当其中一个完成时,我有一个类来存储,以便在需要时使用它。 现在我需要将此图像上传到Firebase存储(修改或新建,无所谓)。Firebase允许我使用以下选项之一:或,每个选项分别需要或。 我怎么能把我的,并从它获得一个或用于上传? -- 或者,为了解决这个问题,当我从Firebase存储中检索图像时,如何获取图像的? 无论

    • 如何获得下载URL? 我有点糊涂了。现在,我被困在修改后的功能更新。下面是我对管理的初始化。

    • 我在SQLite数据库中有一个图像作为BLOB类型,我想将该图像上传到firebase存储中,获取图像的下载URL和尺寸,并将它们添加到Firebase实时数据库中。我已使用 bucket.upload 从本地驱动器成功上传了图像,但我不知道如何上传 blob。 我在服务器端(NodeJS)使用admin-sdk,有一个“上传”功能,但那是在客户端sdk中。

    • 我试图上传一个图像文件,我得到了使用Imagepicker。 但上面的代码返回以下错误 VERBOSE-2:ui\u dart\u状态。cc(186)]未处理的异常:MissingPluginException(未找到方法任务的实现#通道插件上的startPutFile.flatter.io/firebase_存储)#0 MethodChannel_invokeMethod包:flatter/..

    • 我有一个问题与我的代码,我必须上传图像到Firebase存储,我需要的图像来自画廊和相机,从画廊的图像是好的,但来自相机的图像给问题,图像加载在ImageView和被发送到数据库是黑色的。有人知道如何解决这个问题吗,或者你知道任何其他加载图像的方法吗? 来自画廊 从相机