尝试将图像添加到 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)
您调用 putFile
的 StorageReference
是文件写入的确切位置。因此,在您的情况下,图像会写入 ti /Food
,而不是该文件夹中的其他位置。
如果您想在其中生成一个新位置,例如,您可以在其中生成一个新的唯一文件名:
StorageReference uploader=storageReference.child(UUID.randomUUID().toString());
uploader.putFile(filepath)...
我正在尝试将一些食物及其卡路里、蛋白质和 ID 的图像上传到 firebase storage/firebase 实时数据库,所有内容都已添加到 firebase 但我有一个问题,当我尝试上传所有内容时转到 Realtime database ,也转到 storage 但不是图像进入“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+"%");
}
});
}
}
卡路里等输入他们的数据库没有错误我只是对图像有困难,我该如何解决?
问题出在:
StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Food/");
StorageReference uploader=storageReference;
uploader.putFile(filepath)
您调用 putFile
的 StorageReference
是文件写入的确切位置。因此,在您的情况下,图像会写入 ti /Food
,而不是该文件夹中的其他位置。
如果您想在其中生成一个新位置,例如,您可以在其中生成一个新的唯一文件名:
StorageReference uploader=storageReference.child(UUID.randomUUID().toString());
uploader.putFile(filepath)...