【问题标题】:Make upload method return String "the uploaded file url"使上传方法返回 String "上传的文件 url"
【发布时间】:2019-04-13 20:17:55
【问题描述】:

我正在将图像上传到 Firebase 存储,我需要存储中的图像 URL 才能使用它,然后将其插入到 FireStore 的文档中。 如何在上传完成后而不是在完成之前获取url?

   public String uploadImage(byte[] bytes) {
        try {
            final StorageReference ref = storage.child("images/" + new Date().toString());
            ref.putBytes(bytes)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    res = uri.toString();
                                    return;
                                }
                            });
                        }
                    });
            System.out.println("RES : " + res);
            return res;
        }catch (NullPointerException e){
            return null;
        }
    }

//the variable res must return a not null value.

【问题讨论】:

    标签: java android firebase-storage


    【解决方案1】:

    参考::Image not retrieving from Firebase

    //add file on Firebase and got Download Link
    filePath.putFile(imageUri).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 filePath.getDownloadUrl();
        }
    }).addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(@NonNull Task<Uri> task) {
            if (task.isSuccessful()){
                Uri downUri = task.getResult();
                Log.d(TAG, "onComplete: Url: "+ downUri.toString());
            }
        }
    });
    

    【讨论】:

    • 是的,但是它返回null,因为上传过程还没有完成
    【解决方案2】:

    我们可以从taskSnapshot获取文件的URL,像这样:

    public String uploadImage(byte[] bytes) {
        try {
            final StorageReference ref = storage.child("images/" + new Date().toString());
            ref.putBytes(bytes)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl();
                            while (!urlTask.isSuccessful()) ;
                            Uri downloadUrl = urlTask.getResult();
                        }
                    });
            System.out.println("RES : " + res);
            return res;
        }catch (NullPointerException e){
            return null;
        }
    }
    

    希望对你有帮助!

    【讨论】:

    • 非常感谢,但问题是方法在完成上传过程之前返回变量res,所以这个方法返回null。
    • 现在试试,然后告诉我。
    • 哦,我知道你在那里做了什么,是的,这应该有效;非常感谢
    • 逻辑上它应该可以正常工作,但没有工作,应用程序冻结然后退出。
    • 好的,把这里出现的错误放在你的代码中并做一些日志
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多