如何使用Java将图片Url上传到Fire Storage并同时将其保存在fireStore中 [英] how to upload image Url Uploaded to Fire Storage and Save it in fireStore at the Same time Using Java

查看:29
本文介绍了如何使用Java将图片Url上传到Fire Storage并同时将其保存在fireStore中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码,我可以在Toast消息中检索图像URL,但无法将其保存在Firestore中,请告诉我是否有另一种方法可以解决,或者是我存储URL的问题:

Here's my code where i can retrieve the image Url in Toast message where it is unable to save it in firestore please tell me if there is another method to do it or is the problem where i store the URL:

public class register extends AppCompatActivity {

     EditText emails;
    EditText passwords;
    EditText ages;
    Button registers;
    Button addImage;
    EditText country;

    FirebaseFirestore db;
    FirebaseAuth auth;
    FirebaseUser auth1;
    private StorageTask task;

    Uri url ;
    Uri imageUri;

    static final int IMAGE_REQUEST =2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);


        auth = FirebaseAuth.getInstance();
        registers = findViewById(R.id.button);
        emails = findViewById(R.id.eamil);
        passwords = findViewById(R.id.password);
        ages=findViewById(R.id.age);
        country=findViewById(R.id.country);
        addImage = findViewById(R.id.button51);

         db =FirebaseFirestore.getInstance();





             registers.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String v_email = emails.getText().toString();
                String v_password = passwords.getText().toString();


                if (TextUtils.isEmpty(v_email)||TextUtils.isEmpty(v_password)){

                    Toast.makeText(register.this,"Eempty Credentials",Toast.LENGTH_SHORT).show();
                }else if(v_password.length()<6){

                    Toast.makeText(register.this,":password is short",Toast.LENGTH_SHORT).show();

                }else{









                        upload();
                        registerUser(v_email, v_password);




                }
            }
        });

             addImage.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {

                     openImage();

                 }
             });



    }

    private void registerUser(final String email, final String password) {

        auth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(register.this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if(task.isSuccessful()){


                    Map<String , Object> users = new HashMap<>();
                    users.put("Email", emails.getText().toString());
                    users.put("Password", passwords.getText().toString());
                    users.put("Country", country.getText().toString());
                    users.put("AGe", ages.getText().toString());
                    users.put("Image", url.toString());
                    auth1 = FirebaseAuth.getInstance().getCurrentUser();
                    db.collection("Users").document(auth1.getUid()).set(users).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {

                            //Toast.makeText(com.example.pleasework.register.this,"registeration was successful",Toast.LENGTH_SHORT).show();

                        }
                    });



//                    startActivity(new Intent(com.example.pleasework.register.this, MainActivity.class));
//                    finish();


                }else{


                    Toast.makeText(com.example.pleasework.register.this,"Resgisteration fail",Toast.LENGTH_SHORT).show();
                }
            }
        });


    }
    public  String getFileExtension(Uri uri){

        ContentResolver contentResolver = getContentResolver();
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();

        return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));



    }

   public void  upload (){

        if (imageUri != null){


            final StorageReference fileRef  = FirebaseStorage.getInstance().getReference(System.currentTimeMillis()+getFileExtension(imageUri) );

            fileRef.putFile(imageUri)
                    .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

                            fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {

                                    url = uri;
                                    Toast.makeText(register.this,"Upload Sucess" + url.toString(),Toast.LENGTH_SHORT).show();

                                }
                            });

                        }
                    });


        }


    }

    public  void openImage(){

        Intent intent = new Intent();
        intent.setType("image/");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent,IMAGE_REQUEST);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        imageUri=data.getData();

    }
}




            }
        });
    }


}

并且在火灾存储区中,该字段始终为空,但将其保存在火灾存储区中.

and in fire store the field is always coming null but it is saved in the firestorage .

想为FireStore添加图片,但事实并非如此

Wanted to add an image for FireStore but coludn't

谢谢.

推荐答案

此过程称为 AsyncTask ,旨在先执行进程,再执行进程.

This process is called AsyncTask, which is intended to perform a process before a process.

它可以同时上传图像和数据,因此图像链接不会存储,因为它没有完成图像的上传,而且只需不到一秒钟的时间.

It works to upload the image and the data at the same time, so the image link does not store because it did not finish uploading the image, and this is in less than a split of a second.

当图像上传完成,数据存储在FireStore中时,您可以使用此方法:

You can use this method when the image is finished uploading, the data is stored in FireStore :

   private void registerUser(final String email, final String password) {

            auth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(register.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    if(task.isSuccessful()){
                       upload ();
                    }
});

此处,请确保先上传图像,然后将ImageUrl添加到fireStore:

Here be sure to upload the image first and then add ImageUrl to the fireStore :

public void  upload (){

        if (imageUri != null){


            final StorageReference fileRef  = FirebaseStorage.getInstance().getReference(System.currentTimeMillis()+getFileExtension(imageUri) );

            fileRef.putFile(imageUri)
                    .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

                            fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {

                                    url = uri;

                                Map<String , Object> users = new HashMap<>();
                                users.put("Email", emails.getText().toString());
                                users.put("Password", passwords.getText().toString());
                                users.put("Country", country.getText().toString());
                                users.put("AGe", ages.getText().toString());
                                users.put("Image", url.toString());
                                auth1 = FirebaseAuth.getInstance().getCurrentUser();

                    db.collection("Users").document(auth1.getUid()).set(users).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {

                             Toast.makeText(register.this,"Upload Sucess" + url.toString(),Toast.LENGTH_SHORT).show();

                             }
                         });

                       }
                   });
                }
            }); 
        }

    }

这篇关于如何使用Java将图片Url上传到Fire Storage并同时将其保存在fireStore中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆