Firebase Storage - ссылка не создана - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь загрузить изображение и документ в хранилище базы данных и загрузить ссылки, созданные с обеих сторон, в БД в реальном времени, все происходит при нажатии кнопки. Но в базе данных Firebase ссылки не загружаются, в то время как другой текст, который я загружаю вместе с ними, есть.

Код загрузки хранилища:

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

        }
    });

}

Где Updata - кнопка, UploadData - это класс для хранения всех этих значений ...

После того, как я нажму кнопку, изображение будет сохранено в хранилище, в то время как в базе данных ничего не будет, кроме

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

, хотя он должен включать ImgLink и DocLink . Где теряется трек?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Каждый метод onSuccess вызывается асинхронно после завершения вызова на сервер. Поскольку это занимает много времени, ваш основной код продолжается, а это означает, что вы пишете в базу данных, прежде чем URL-адрес для загрузки станет доступен.

Это проще всего увидеть, если вы поместите некоторые записи журнала в свой код:

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

Вывод этого:

Начало загрузки данных изображения

Запись информации в базу данных

Загрузка данных изображения, получение загрузки URL

Получил URL для загрузки

Вероятно, это не то, что вы ожидали, но он работает так, как задумано, и полностью объясняет, почему URL для загрузки не записывается в базу данных: Когда вы пишете в базу данных, URL-адрес для загрузки еще не загружен.


Решение этой проблемы всегда одно и то же: любой код, для которого требуется URL-адрес для загрузки, должен находиться внутри onSuccess метод, который вызывается при получении URL-адреса для загрузки (или, по крайней мере, должен вызываться оттуда).

Так что-то вроде:

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

}
0 голосов
/ 30 марта 2020

Попробуйте этот код

Объявите этот объект глобально

Uri uri;

Установите URI, когда пользователь выбирает изображение из галереи

@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();
        }
    }
}

Здесь sUrl будет иметь 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){}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...