尝试将图像添加到 firebase 存储文件夹失败

attempt to add image to firebase storage folder failing

我正在尝试将一些食物及其卡路里、蛋白质和 ID 的图像上传到 firebase storage/firebase 实时数据库,所有内容都已添加到 firebase 但我有一个问题,当我尝试上传所有内容时转到 Realtime database ,也转到 storage 但不是图像进入“food”文件夹,它只是作为名为“food”的图像添加到文件夹下,我不明白为什么,它是这样的: 但我希望它进入文件夹并拥有自己的名称而不是生成的名称,这是我的代码 activity:

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;

import java.io.InputStream;
import java.util.Random;

public class Admin_addfood extends AppCompatActivity {
    EditText name,calories,proteins,id;
    Uri filepath;
    ImageView foodimg;
    Button browse,addfood;
    Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_addfood);
        foodimg=(ImageView)findViewById(R.id.img_addfood);
        name=findViewById(R.id.t4);
        calories=findViewById(R.id.t1);
        proteins=findViewById(R.id.t2);
        addfood=findViewById(R.id.upload);
        id=findViewById(R.id.t3);
        browse=(Button)findViewById(R.id.browse);
        browse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Dexter.withActivity(Admin_addfood.this)
                        .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                        .withListener(new PermissionListener() {
                            @Override
                            public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                                Intent intent=new Intent(Intent.ACTION_PICK);
                                intent.setType("image/*");
                                startActivityForResult(Intent.createChooser(intent,"Select Image File"),1);

                            }

                            @Override
                            public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {

                            }

                            @Override
                            public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                                permissionToken.continuePermissionRequest();

                            }
                        }).check();

            }
        });
        addfood.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                uploadtofirebase();

            }
        });

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode==1 && resultCode==RESULT_OK){
            filepath=data.getData();
            try {
                InputStream inputStream=getContentResolver().openInputStream(filepath);
                bitmap= BitmapFactory.decodeStream(inputStream);
                foodimg.setImageBitmap(bitmap);

            }catch (Exception e){



            }

        }

        super.onActivityResult(requestCode, resultCode, data);
    }
    private void uploadtofirebase() {
        foodimg=(ImageView)findViewById(R.id.img_addfood);
        name=(EditText) findViewById(R.id.t4);
        calories=(EditText)findViewById(R.id.t1);
        proteins=(EditText)findViewById(R.id.t2);
        id=findViewById(R.id.t3);
        ProgressDialog dialog=new ProgressDialog(this);
        dialog.setTitle("File Uploader");
        dialog.show();
        StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Food/");
        StorageReference uploader=storageReference;
        uploader.putFile(filepath)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        uploader.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                FirebaseDatabase db=FirebaseDatabase.getInstance();
                                DatabaseReference root=db.getReference("list");
                                Calories obj=new Calories(name.getText().toString(),calories.getText().toString(),proteins.getText().toString(),uri.toString());
                                root.child(id.getText().toString()).setValue(obj);
                                name.setText("");
                                calories.setText("");
                                proteins.setText("");
                                id.setText("");
                                foodimg.setImageResource(R.drawable.ic_launcher_background);
                                Toast.makeText(getApplicationContext(), "uploaded", Toast.LENGTH_SHORT).show();
                                dialog.dismiss();




                            }
                        });

                    }
                }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(@NonNull UploadTask.TaskSnapshot snapshot) {
                float precent=(100*snapshot.getBytesTransferred())/snapshot.getTotalByteCount();
                dialog.setMessage("Uploaded:"+(int)precent+"%");


            }
        });







    }


}

卡路里等输入他们的数据库没有错误我只是对图像有困难,我该如何解决?

问题出在:

StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Food/");
StorageReference uploader=storageReference;
uploader.putFile(filepath)

您调用 putFileStorageReference 是文件写入的确切位置。因此,在您的情况下,图像会写入 ti /Food,而不是该文件夹中的其他位置。

如果您想在其中生成一个新位置,例如,您可以在其中生成一个新的唯一文件名:

StorageReference uploader=storageReference.child(UUID.randomUUID().toString());
uploader.putFile(filepath)...