Как сохранить downloadUrl нескольких изображений в Firebase Firestore? Невозможно создать и сохранить в нескольких полях в документе Firestore - PullRequest
1 голос
/ 17 марта 2020

Вот то, что я смог получить до сих пор. После выбора изображений

selectImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mUploadTask != null && mUploadTask.isInProgress()){
                    Toast.makeText(MainActivity.this, "Upload In Progress", Toast.LENGTH_SHORT).show();
                }
                else {
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(intent, "Select Picture"), RESULT_LOAD_IMAGE);
                }
            }
        });

Внутри OnActivityResult я загружаю выбранные изображения в хранилище Firebase и одновременно хочу сохранить загруженные URL-адреса этих нескольких изображений в Firebase Firestore

 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     String fileName;
     final String[] downloadUrl = new String[1];
     if(requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK){
         if(data.getClipData() != null){ 

             int totalItemsSelected = data.getClipData().getItemCount();

             for(int i =0;i<totalItemsSelected;i++){

                 Uri fileUri = data.getClipData().getItemAt(i).getUri();
                 fileName = getFileName(fileUri);
                 fileNameList.add(fileName);
                 fileDoneList.add("uploading");
                 uploadListAdapter.notifyDataSetChanged();

                 final StorageReference fileToUpload = storageReference.child("Images").child(fileName);

                 final int finalI = i;
                 final int totalCount = totalItemsSelected;
                 mUploadTask = fileToUpload.putFile(fileUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                     @Override
                     public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                         fileToUpload.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                             @Override
                             public void onSuccess(Uri uri) {
                                 String url = String.valueOf(uri);
                                 storeLink(url,totalCount);//Method To Store the Url
                             }
                         });
                         // Toast.makeText(add_for_sale.this, "Uploading works", Toast.LENGTH_SHORT).show();
                         fileDoneList.remove(finalI);
                         fileDoneList.add(finalI,"done");

                         uploadListAdapter.notifyDataSetChanged();

                     }
                 });
                // ImageUploadInfo imageUploadInfo = new ImageUploadInfo(downloadUrl[0],fileName);


             }

             Toast.makeText(this, "Upload in Progress", Toast.LENGTH_SHORT).show();
         }
         else if(data.getData() != null){
             Toast.makeText(this, "Selected Single", Toast.LENGTH_SHORT).show();
         }
     }
 }


В методе storeLink(url,totalCount) я создаю объект карты для создания поля «imageUrl» внутри документа, где «29t0Boxm0fa8UNkomuo5xPLwkx13» - это идентификатор пользователя.

private void storeLink(final String url,final int totalCount) {
    FirebaseFirestore storeUrl = FirebaseFirestore.getInstance();
    Toast.makeText(MainActivity.this, url, Toast.LENGTH_LONG).show();
    for (int i=0;i<totalCount;i++) {
        final Map<String, Object> image = new HashMap<>();
        image.put("imageUrl"+i, url);
        DocumentReference documentReference = storeUrl.collection("users").document("29t0Boxm0fa8UNkomuo5xPLwkx13");

        documentReference.set(image).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "" +
                        "OnSuccess : Image Link Saved ");
                // startActivity(new Intent(Register.this,LoginActivity.class));
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "OnFailure : " + e.toString());
            }
        });
    }
}

Хранилище Правила

  rules_version = '2'
       service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }



Firestore Rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Вот что в итоге сработало для меня:

Создайте глобальную переменную ArrayList

ArrayList<String> imageList;

Затем инициализируйте этот ArrayList внутри

onActivityResult как imageList = new ArrayList<>(totalItemsSelected);, как указано в приведенном ниже коде

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

    String fileName;

    if(requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK){
        if(data.getClipData() != null){
            progressBar.setVisibility(View.VISIBLE);
            final int totalItemsSelected = data.getClipData().getItemCount();
            count = totalItemsSelected;
            imageList = new ArrayList<>(totalItemsSelected);

            StorageReference ImageFolder = FirebaseStorage.getInstance().getReference().child("ImageFolder");

            for(int i =0;i<totalItemsSelected;i++){

                Uri fileUri = data.getClipData().getItemAt(i).getUri();
                fileName = getFileName(fileUri);


                fileNameList.add(fileName);
                fileDoneList.add("uploading");
                uploadListAdapter.notifyDataSetChanged();

                final StorageReference fileToUpload = ImageFolder.child(fileName);
                final int finalI = i;

                mUploadTask = fileToUpload.putFile(fileUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        progressBar.setVisibility(View.INVISIBLE);


                        fileToUpload.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                               String url = String.valueOf(uri);
                               imageList.add(url);
                               // Toast.makeText(add_for_sale.this, imageList.get(finalI), Toast.LENGTH_SHORT).show();
                               Log.i(TAG,"Added To List");
                            }
                        });
                        fileDoneList.remove(finalI);
                        fileDoneList.add(finalI,"done");

                        uploadListAdapter.notifyDataSetChanged();
                    }
                });

            }

            Toast.makeText(this, "Upload in Progress", Toast.LENGTH_SHORT).show();
        }
        else if(data.getData() != null){
            Toast.makeText(this, "Select Two or More Images", Toast.LENGTH_SHORT).show();
        }
    }
}

Теперь, чтобы сохранить URL-ссылки на Firefase Firestore Добавьте ссылки на ArrayList как imageList.add(url;)

и загрузите это список imageList для FireStore как

Map<String,Object> imageUrl = new HashMap<>();
                imageUrl.put("ImageUrl", imageList);
                String userId;
                userId = firebaseUser.getUid();
                firebaseFirestore.collection("ImageDetails").document(userId)
                        .set(imageUrl,SetOptions.merge());

Это создаст массив ImageUrl внутри вашего документа FireStore

enter image description here

0 голосов
/ 18 марта 2020
  • Убедитесь, что вы сделали окончательный вариант для Map <<code>String,Object> user = new HashMap <> ();
  • И добавьте user.put ("key","value") внутри l oop.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    final DocumentReference documentReference = db.collection("users").document("multi_image");
    final Map<String, Object> user = new HashMap<>();
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK) {
        if (data.getClipData() != null) {
            final int totalItemsSelected = data.getClipData().getItemCount();
            for (int i = 0; i < totalItemsSelected; i++) {
                Uri fileUri = data.getClipData().getItemAt(i).getUri();
                final int x = i;
                final StorageReference fileToUpload = mStorageRef.child("Images").child("" + x);
                fileToUpload.putFile(fileUri)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
                                Task<Uri> DownloadURL = taskSnapshot.getStorage().getDownloadUrl();
                                DownloadURL.addOnSuccessListener(new OnSuccessListener<Uri>() {
                                    @Override
                                    public void onSuccess(Uri uri) {
                                        user.put("image_" + x, uri.toString());
                                        Log.v("users", "" + user);
                                        documentReference.update(user)
                                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                    @Override
                                                    public void onSuccess(Void aVoid) {
                                                        Log.v("task", "Success");
                                                    }
                                                })
                                                .addOnFailureListener(new OnFailureListener() {
                                                    @Override
                                                    public void onFailure(@NonNull Exception e) {
                                                        Log.v("failed", "" + e);
                                                    }
                                                });
                                    }
                                });
                            }
                        });
            }
            Toast.makeText(this, "Upload in Progress", Toast.LENGTH_SHORT).show();
        } else if (data.getData() != null) {
            Toast.makeText(this, "Selected Single", Toast.LENGTH_SHORT).show();
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

База данных Firebase https://i.stack.imgur.com/HeYvh.png

База данных Firebase https://i.stack.imgur.com/3t2aN.png

...