【问题标题】:attempt to add image to firebase storage folder failing尝试将图像添加到 Firebase 存储文件夹失败
【发布时间】:2021-05-20 01:28:34
【问题描述】:

我正在尝试将一些食物、其卡路里、蛋白质和 ID 的图像上传到 firebase 存储/firebase 实时数据库,所有内容都会添加到 firebase 但我有一个问题,当我尝试将所有内容上传到实时数据库时,以及存储,但不是将图像放入“food”文件夹中,而是将其添加为文件夹下名为“food”的图像,我不明白为什么,就像这样: 但我希望它进入文件夹并拥有自己的名称而不是生成的名称,这是我用于此活动的代码:

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+"%");


            }
        });







    }


}

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

【问题讨论】:

    标签: android firebase firebase-storage


    【解决方案1】:

    问题出在:

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

    【讨论】:

    • 但我希望它进入 Food 文件夹而不是新位置,它只是作为图像添加到文件夹下
    猜你喜欢
    • 2020-10-03
    • 2021-07-21
    • 2019-05-07
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多