Firebase Storage - Link not created

一曲冷凌霜 提交于 2020-06-29 04:40:06

问题


I am trying to upload an image and a document to the firebase storage and upload the links created from both to the Real-Time DB, everything happening on a button's click. But in the firebase DB, the links are not uploaded while the other text I upload along with them is there.

Storage upload code:

updata.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //before uploading both the doc and img..
            progressDialog.setTitle("Uploading Images");
            progressDialog.show();

            final UploadData uploadData=new UploadData();

            if(ImgPathUri!=null){
                StorageReference str=storageReference.child(StoragePath + System.currentTimeMillis() + "." + getExtension(ImgPathUri));

                str.putFile(ImgPathUri)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                taskSnapshot.getStorage().getDownloadUrl()
                                        .addOnSuccessListener(new OnSuccessListener<Uri>() {
                                            @Override
                                            public void onSuccess(Uri uri) {

                                                String ImgLink=uri.toString();
                                                linkimg=ImgLink;
                                                uploadData.setImgURL(linkimg);

                                            }
                                        });

                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(addEventActivity.this, "fucked ra", Toast.LENGTH_SHORT).show();
                                finished=false;
                            }
                        })
                        .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {

                            }
                        });
            }

            if(DocPathUri!=null){
                StorageReference storageReference1=storageReference.child(StoragePath + System.currentTimeMillis() + "." + getExtension(DocPathUri));

                storageReference1.putFile(DocPathUri)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                taskSnapshot.getStorage().getDownloadUrl()
                                        .addOnSuccessListener(new OnSuccessListener<Uri>() {
                                            @Override
                                            public void onSuccess(Uri uri) {
                                                String DocLink=uri.toString();
                                                linkdoc=DocLink;
                                                uploadData.setDocURL(linkdoc);
                                            }
                                        })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Log.e("TAG_FOR_FAILURE LOG", "On Failure: The exception", e);
                                    }
                                });

                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                finished=false;
                                Toast.makeText(addEventActivity.this, "doc fucked", Toast.LENGTH_SHORT).show();
                            }
                        });
            }

            progressDialog.dismiss();


            String info=infoText.getText().toString();
            String event=eventName.getText().toString();

            uploadData.setName(event);
            uploadData.setInfo(info);

            //uploading the event name,info and other file links to the RTDB under the event name
            databaseReference.child(event).setValue(uploadData);

        }
    });

}

Where updata is the button, UploadData is the class for holding those all those values...

After I click the button the image is stored in the Storage while the Database holds nothing but,

data {
   name:"given name"
   info:"given info"
}

while it has to have included the ImgLink and DocLink. Where does it lose track?


回答1:


Try this code

Declare this object globally

Uri uri;

Set uri when user fetches the Image from the gallery

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) {

        uri = data.getData();
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            jimg.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Here sUrl will have downloadURL

private void uploadImage() {
    try {
        final StorageReference ref = storageReference.child(  UUID.randomUUID().toString() );

        //uploads the image
        ref.putFile( uri ).addOnSuccessListener( new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                ref.getDownloadUrl().addOnSuccessListener( new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        final Uri downloadUrl = uri;
                        sUrl = downloadUrl.toString();

                    }
                } ).addOnFailureListener( new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {

                    }
                } );


            }
        } );
    }catch (Exception e){}
}



回答2:


Each onSuccess method is called asynchronously, after the call to the server has completed. Since this takes time, you main code continues, and this means you're writing to the database, before the download URL is available.

It's easiest to see this if you place some log statements in your code:

Log.i("STORAGE", "Starting to upload image data");
StorageReference storageReference1=storageReference.child(StoragePath + System.currentTimeMillis() + "." + getExtension(DocPathUri));

storageReference1.putFile(DocPathUri)
        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Log.i("STORAGE", "Image data uploaded, getting download URL");

                taskSnapshot.getStorage().getDownloadUrl()
                        .addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                Log.i("STORAGE", "Got download URL");
                                String DocLink=uri.toString();
                                linkdoc=DocLink;
                                uploadData.setDocURL(linkdoc);
                            }
                        })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e("TAG_FOR_FAILURE LOG", "On Failure: The exception", e);
                    }
                });

            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                finished=false;
                Toast.makeText(addEventActivity.this, "doc fucked", Toast.LENGTH_SHORT).show();
            }
        });

...

uploadData.setName(event);
uploadData.setInfo(info);

Log.i("STORAGE", "Writing info to database");
databaseReference.child(event).setValue(uploadData);

The output of this is:

Starting to upload image data

Writing info to database

Image data uploaded, getting download URL

Got download URL

This is probably not what you expected, but it is working as intended, and completely explains why the download URL isn't written to the database: by the time you write to the database, the download URL hasn't been loaded yet.


The solution to this problem is always the same: any code that requires the download URL, need to be inside the onSuccess method that gets called when the download URL is retrieved (or at least needs to be called from there).

So something like:

updata.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //before uploading both the doc and img..
            progressDialog.setTitle("Uploading Images");
            progressDialog.show();

            final UploadData uploadData=new UploadData();

            if(ImgPathUri!=null){
                StorageReference str=storageReference.child(StoragePath + System.currentTimeMillis() + "." + getExtension(ImgPathUri));

                str.putFile(ImgPathUri)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                taskSnapshot.getStorage().getDownloadUrl()
                                        .addOnSuccessListener(new OnSuccessListener<Uri>() {
                                            @Override
                                            public void onSuccess(Uri uri) {

                                                String ImgLink=uri.toString();
                                                linkimg=ImgLink;
                                                uploadData.setImgURL(linkimg);

                                            }
                                        });

                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(addEventActivity.this, "fucked ra", Toast.LENGTH_SHORT).show();
                                finished=false;
                            }
                        })
                        .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {

                            }
                        });
            }

            if(DocPathUri!=null){
                StorageReference storageReference1=storageReference.child(StoragePath + System.currentTimeMillis() + "." + getExtension(DocPathUri));

                storageReference1.putFile(DocPathUri)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                taskSnapshot.getStorage().getDownloadUrl()
                                        .addOnSuccessListener(new OnSuccessListener<Uri>() {
                                            @Override
                                            public void onSuccess(Uri uri) {
                                                String DocLink=uri.toString();
                                                linkdoc=DocLink;

                                                uploadData.setDocURL(linkdoc);


                                                progressDialog.dismiss();


                                                String info=infoText.getText().toString();
                                                String event=eventName.getText().toString();

                                                uploadData.setName(event);
                                                uploadData.setInfo(info);

                                                //uploading the event name,info and other file links to the RTDB under the event name
                                                databaseReference.child(event).setValue(uploadData);
                                            }
                                        })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Log.e("TAG_FOR_FAILURE LOG", "On Failure: The exception", e);
                                    }
                                });

                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                finished=false;
                                Toast.makeText(addEventActivity.this, "doc fucked", Toast.LENGTH_SHORT).show();
                            }
                        });
            }
        }
    });

}


来源:https://stackoverflow.com/questions/60928823/firebase-storage-link-not-created

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!