how to upload to firebase a file with firebase storage

坚强是说给别人听的谎言 提交于 2020-01-03 03:56:27

问题


i try to upload to firebase a picture and when i upload its show me that the size of the file is 0 bytes and dont show the content picture

everything seems fine, then whay its happen???

  StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-bucket-name>");

                if (inputStream!=null) {

                    String pic = "BathroomImage" + +rand.nextInt(1000) + ".jpg";
                    mountainsRef = storageRef.child(pic);
                    uploadTask = mountainsRef.putStream(inputStream);


                    uploadTask.addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.d("this is the faiure:","hey im here");
                        }
                    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            taskSnapshot.getMetadata();
                            Uri downloadUri = taskSnapshot.getDownloadUrl();
                            bitmap.recycle();
                            bitmap=null;
                            System.gc();

                            try {
                                inputStream.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
            }
        }

here i upload the picture from the data to inputsream.

  void TakePickphoto(){
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Create intent to Open Image applications like Gallery, Google Photos
        startActivityForResult( galleryIntent, RESULT_LOAD_IMAGE);// Start the Intent

 public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


        if (requestCode == RESULT_LOAD_IMAGE && resultCode ==getActivity().RESULT_OK && null != data) {
            selectedImage = data.getData(); // Get the  URI Image from data

            handler= new Handler();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {

                        inputStream = context.getContentResolver().openInputStream(data.getData());
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inSampleSize =4;
                        bitmap = BitmapFactory.decodeStream(inputStream, new Rect(40,40,40,40),options);

                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            ImageView imageView;
                            imageView = (ImageView) view.findViewById(R.id.imageView2);
                            imageView.setImageBitmap(bitmap);


                        }
                    });
                }
            };
            new Thread(runnable).start();

        }
    }
}

please help, everything look fine to me.


回答1:


** This will not save the image in full resolution ** To save a picture in full resolution, research how to do that when you start the TakePictureIntent.

I had the same error and solved it by setting up my picture taking and uploading like this:

    //takes the picture
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, 1);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
            //saves the pic locally
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] dataBAOS = baos.toByteArray();

            /***************** UPLOADS THE PIC TO FIREBASE*****************/
            // Points to the root reference
            StorageReference storageRef = FirebaseStorage.getInstance().getReferenceFromUrl("your-root-storage-ref");
            StorageReference imagesRef = storageRef.child("image");

            UploadTask uploadTask = imagesRef.putBytes(dataBAOS);
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                    Uri downloadUrl = taskSnapshot.getDownloadUrl();
                }
            });
        }
    }

This way it will compress and save your image in your Firebase Storage with this file struct:

root -> image




回答2:


You can pass the InputStream directly from the Uri to the putStream method. You may want to resize the image yourself before uploading it, which would require a bit more work, but this way uses very little memory on the client side.

    if (requestCode == IMAGE_PICKER_SELECT && resultCode == Activity.RESULT_OK) {
        Uri imageUri = data.getData();
        try {
            ContentResolver contentResolver = getActivity().getContentResolver();
            StorageMetadata storageMetadata = new StorageMetadata.Builder()
                    .setContentType(contentResolver.getType(imageUri))
                    .build();
            FirebaseStorage.getInstance().getReference()
                    .child("users")
                    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                    .child(UUID.randomUUID().toString())
                    .putStream(contentResolver.openInputStream(imageUri), storageMetadata)
                    .addOnSuccessListener(getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot task) {
                            Uri downloadUrl = task.getDownloadUrl();                               
                            Toast.makeText(getActivity(), R.string.image_successfully_uploaded, Toast.LENGTH_LONG).show();
                        }
                    })
                    .addOnFailureListener(getActivity(), new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getActivity(), R.string.error_uploading_image, Toast.LENGTH_LONG).show();
                        }
                    });
        } catch (IOException e) {

        }

    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }


来源:https://stackoverflow.com/questions/38168014/how-to-upload-to-firebase-a-file-with-firebase-storage

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