Как хранить и получать изображения изображений из базы данных в режиме реального времени с помощью Firebase? - PullRequest
1 голос
/ 06 октября 2019

У меня проблема с сохранением URL-адреса изображения в базе данных в реальном времени. Он хранит URL-адрес, который не связан с URL-адресом изображения в хранилище.

private  void uploadFile (){
        if (mImageUri != null){
            StorageReference fileReference = mStorageRef.child(System.currentTimeMillis()
            + "." + getFileExtension(mImageUri));

            uploadProgressBar.setVisibility(View.VISIBLE);
            uploadProgressBar.setIndeterminate(true);

            mUploadTask = fileReference.putFile(mImageUri)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    uploadProgressBar.setVisibility(View.VISIBLE);
                                    uploadProgressBar.setIndeterminate(false);
                                    uploadProgressBar.setProgress(0);
                                }
                            },500);

                            Toast.makeText(AddProductActivity.this, "Product is added successfully!", Toast.LENGTH_SHORT).show();

                            Product product = new Product(productName.getText().toString()
                                    ,productDescription.getText().toString()
                                    ,price.getText().toString()
                                    ,taskSnapshot.getUploadSessionUri().toString()
                                    ,oldPrice.getText().toString()
                                    , quantity.getText().toString());

                            String uploadID = mDatabaseRef.push().getKey();
                            mDatabaseRef.child(uploadID).setValue(product);


                            uploadProgressBar.setVisibility(View.INVISIBLE);
                            openMainActivity();

                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            uploadProgressBar.setVisibility(View.INVISIBLE);
                            Toast.makeText(AddProductActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(@NonNull UploadTask.TaskSnapshot taskSnapshot) {
                            double progress = (100.0 *taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            uploadProgressBar.setProgress((int) progress);


                        }
                    });
        } else {
            Toast.makeText(this, "You haven't Selected any file", Toast.LENGTH_SHORT).show();
        }
    }

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

Недопустимый запрос. Заголовок X-Goog-Upload-Command отсутствует.

1 Ответ

0 голосов
/ 06 октября 2019

Вам нужно изменить taskSnapshot.getUploadSessionUri().toString() при загрузке изображения в правый URI, как показано ниже

Ниже приведен пример, чтобы получить правильный URI

firebaseStorageReference.putFile(resultUri)
        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                final Task<Uri> firebaseUri = taskSnapshot.getStorage().getDownloadUrl();

                    firebaseUri.addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            String mDownloadUri = uri.toString();
                        }
                    });

                }
            });

и применить его в своем коде

private  void uploadFile (){
        if (mImageUri != null){
            StorageReference fileReference = mStorageRef.child(System.currentTimeMillis()
            + "." + getFileExtension(mImageUri));

            uploadProgressBar.setVisibility(View.VISIBLE);
            uploadProgressBar.setIndeterminate(true);

            mUploadTask = fileReference.putFile(mImageUri)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    uploadProgressBar.setVisibility(View.VISIBLE);
                                    uploadProgressBar.setIndeterminate(false);
                                    uploadProgressBar.setProgress(0);
                                }
                            },500);


                            final Task<Uri> firebaseUri = taskSnapshot.getStorage().getDownloadUrl();
                            firebaseUri.addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    String downloadUri = uri.toString();

                                    Toast.makeText(AddProductActivity.this, "Product is added successfully!", Toast.LENGTH_SHORT).show();

                                    Product product = new Product(productName.getText().toString()
                                            ,productDescription.getText().toString()
                                            ,price.getText().toString()
                                            ,downloadUri
                                            ,oldPrice.getText().toString()
                                            , quantity.getText().toString());

                                    String uploadID = mDatabaseRef.push().getKey();
                                    mDatabaseRef.child(uploadID).setValue(product);

                                    uploadProgressBar.setVisibility(View.INVISIBLE);
                                    openMainActivity();

                                }
                            });
// rest of your code

Надеюсь, это поможет, и я приветствую дальнейшую поддержку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...